/ Hex Artifact Content
Login

Artifact 3af4caaa32f26d537ff857ac30d3ac3ce7e46ea5:


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 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
9c20: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
9c30: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
9c40: 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20  ? "RESERVED" :. 
9c50: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
9c60: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9c70: 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a   ? "EXCLUSIVE" :
9c80: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
9c90: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  k==SHARED_LOCK  
9ca0: 20 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a     ? "SHARED" :.
9cb0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
9cc0: 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20  ==UNKNOWN_LOCK  
9cd0: 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20    ? "UNKNOWN" : 
9ce0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
9cf0: 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  , p->exclusiveMo
9d00: 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22  de ? "exclusive"
9d10: 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20   : "normal".    
9d20: 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f    , p->journalMo
9d30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f  LMODE_MEMORY   ?
9d50: 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20   "memory" :.    
9d60: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
9d70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d80: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f  LMODE_OFF      ?
9d90: 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20   "off" :.       
9da0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9db0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9dc0: 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64  DE_DELETE   ? "d
9dd0: 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20  elete" :.       
9de0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9df0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9e00: 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70  DE_PERSIST  ? "p
9e10: 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20  ersist" :.      
9e20: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
9e30: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9e40: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22  ODE_TRUNCATE ? "
9e50: 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20  truncate" :.    
9e60: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
9e70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9e80: 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f  LMODE_WAL      ?
9e90: 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72   "wal" : "?error
9ea0: 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  ?".      , (int)
9eb0: 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e  p->tempFile, (in
9ec0: 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74  t)p->memDb, (int
9ed0: 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  )p->useJournal. 
9ee0: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
9ef0: 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c  lOff, p->journal
9f00: 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  Hdr.      , (int
9f10: 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74  )p->dbSize, (int
9f20: 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20  )p->dbOrigSize, 
9f30: 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69  (int)p->dbFileSi
9f40: 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  ze.  );..  retur
9f50: 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
9f60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9f70: 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63  rue if it is nec
9f80: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
9f90: 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74  page *pPg into t
9fa0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
9fb0: 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20  ** A page needs 
9fc0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9fd0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
9fe0: 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73  al if there exis
9ff0: 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72  ts one.** or mor
a000: 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
a010: 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a  s for which:.**.
a020: 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d  **   * The page-
a030: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
a040: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
a050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e  PagerSavepoint.n
a060: 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  Orig, and.**   *
a070: 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   The bit corresp
a080: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  onding to the pa
a090: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  ge-number is not
a0a0: 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50   set in.**     P
a0b0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
a0c0: 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  nSavepoint..*/.s
a0d0: 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65  tatic int subjRe
a0e0: 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72  quiresPage(PgHdr
a0f0: 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70   *pPg){.  Pgno p
a100: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
a110: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a120: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
a130: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a140: 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53  =0; i<pPager->nS
a150: 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a  avepoint; i++){.
a160: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
a170: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
a180: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a  >aSavepoint[i];.
a190: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67      if( p->nOrig
a1a0: 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c  >=pgno && 0==sql
a1b0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
a1c0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
a1d0: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
a1e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
a1f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
a200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a210: 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20  rue if the page 
a220: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
a230: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
a240: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a250: 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64  geInJournal(PgHd
a260: 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  r *pPg){.  retur
a270: 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  n sqlite3BitvecT
a280: 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d  est(pPg->pPager-
a290: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
a2a0: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
a2b0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
a2c0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
a2d0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
a2e0: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
a2f0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
a300: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
a310: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
a320: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
a330: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
a340: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
a350: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
a360: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
a370: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
a380: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
a390: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
a3a0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
a3b0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
a3c0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
a3d0: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
a3e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a3f0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
a400: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a410: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
a420: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
a430: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a440: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
a450: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
a460: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
a470: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
a480: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
a490: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
a4a0: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
a4b0: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
a4c0: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
a4d0: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
a4e0: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
a4f0: 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a  (u8*)A,B).../*.*
a500: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
a510: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
a520: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
a530: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
a540: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
a550: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
a560: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
a570: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
a580: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
a590: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
a5a0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
a5b0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
a5c0: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
a5d0: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
a5e0: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
a5f0: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
a600: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
a610: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  et);.}../*.** Un
a620: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
a630: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
a640: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
a650: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
a660: 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44  OCK.** or SHARED
a670: 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73  _LOCK. Regardles
a680: 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
a690: 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  not the call to 
a6a0: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63  xUnlock().** suc
a6b0: 63 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50  ceeds, set the P
a6c0: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
a6d0: 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ble to match the
a6e0: 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77   (attempted) new
a6f0: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63   lock..**.** Exc
a700: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
a710: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
a720: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
a730: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
a740: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
a750: 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65  ot modify it. Se
a760: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
a770: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
a780: 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c  of .** UNKNOWN_L
a790: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
a7a0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a  nation of this..
a7b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a7c0: 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65  gerUnlockDb(Page
a7d0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
a7e0: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
a7f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
a800: 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
a810: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
a820: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
a830: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
a840: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
a850: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
a860: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
a870: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a880: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
a890: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
a8a0: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
a8b0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
a8c0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
a8d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
a8e0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
a8f0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  Lock);.    if( p
a900: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
a910: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
a920: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
a930: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  k = eLock;.    }
a940: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
a950: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
a960: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
a970: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
a990: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a9a0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
a9b0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
a9c0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
a9d0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
a9e0: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
a9f0: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
aa00: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
aa10: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
aa20: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
aa30: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
aa40: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
aa50: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
aa60: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
aa70: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
aa80: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
aa90: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
aaa0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
aab0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
aac0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
aad0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
aae0: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
aaf0: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
ab00: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
ab10: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
ab20: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
ab30: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
ab40: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
ab50: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
ab60: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
ab70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ab80: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
ab90: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
aba0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
abb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
abc0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
abd0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
abe0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
abf0: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
ac00: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
ac10: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
ac20: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
ac30: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
ac40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ac50: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
ac60: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
ac70: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
ac80: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
ac90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
aca0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
acb0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
acc0: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
acd0: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
ace0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
acf0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
ad00: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
ad10: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
ad20: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
ad30: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
ad40: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
ad50: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
ad60: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
ad70: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
ad80: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
ad90: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
ada0: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
adb0: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
adc0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
add0: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
ade0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
adf0: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
ae00: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
ae10: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
ae20: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
ae30: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
ae40: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
ae50: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
ae60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69  ..**.** The opti
ae70: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f  mization is also
ae80: 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20   always enabled 
ae90: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
aea0: 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e  les. It is.** an
aeb0: 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74   error to call t
aec0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
aed0: 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64  pPager is opened
aee0: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
aef0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  .** database..**
af00: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
af10: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
af20: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
af30: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
af40: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
af50: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
af60: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
af70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
af80: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
af90: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
afa0: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
afb0: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
afc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
afd0: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
afe0: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
aff0: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
b000: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
b010: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
b020: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
b030: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
b040: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
b070: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
b080: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
b0b0: 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ze */.    int sz
b0c0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b0e0: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20  age size */..   
b0f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
b100: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
b110: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
b120: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
b130: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
b140: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
b150: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
b160: 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65  Size;.    szPage
b170: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
b180: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
b190: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
b1a0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
b1b0: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
b1c0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
b1d0: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
b1e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
b1f0: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
b200: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
b210: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
b220: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
b230: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
b240: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
b250: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b260: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
b270: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d  PG_SZ(pPager);.}
b280: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
b290: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
b2a0: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
b2b0: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
b2c0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
b2d0: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
b2e0: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
b2f0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
b300: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
b310: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
b320: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
b330: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
b340: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
b350: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
b360: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
b370: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
b380: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
b390: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
b3a0: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
b3b0: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
b3c0: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
b3d0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b3e0: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
b3f0: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
b400: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
b410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
b420: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
b430: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
b440: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
b450: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
b460: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
b470: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
b480: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
b490: 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a  )pPage->pData);.
b4a0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
b4b0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
b4c0: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
b4d0: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
b4e0: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
b4f0: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
b500: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
b510: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
b520: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
b530: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
b540: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
b550: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
b560: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
b570: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
b580: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
b590: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
b5a0: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
b5b0: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
b5c0: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
b5d0: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
b5e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
b5f0: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
b600: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
b610: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
b620: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b630: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b640: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
b650: 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73  t( !pPg->pageHas
b660: 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  h || pPager->err
b670: 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70  Code.      || (p
b680: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
b690: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
b6a0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
b6b0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
b6c0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
b6d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
b6e0: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
b6f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
b700: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45  )  0.#define CHE
b710: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
b720: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
b730: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
b740: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
b750: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
b760: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
b770: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
b780: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
b790: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
b7a0: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
b7b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
b7c0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
b7d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
b7e0: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
b7f0: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
b800: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
b810: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
b820: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
b830: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
b840: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
b850: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
b860: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
b870: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b880: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
b890: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
b8a0: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
b8b0: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
b8c0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
b8d0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
b8e0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
b8f0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
b900: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
b910: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
b920: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
b930: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
b940: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
b950: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
b960: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
b970: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
b980: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
b990: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
b9a0: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
b9b0: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
b9c0: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
b9d0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
b9e0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
b9f0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
ba00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
ba10: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
ba20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
ba30: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
ba40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
ba50: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
ba60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ba70: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
ba80: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
ba90: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
baa0: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
bab0: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
bac0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
bad0: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
bae0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
baf0: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
bb00: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
bb10: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
bb20: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
bb30: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
bb40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
bb50: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
bb60: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
bb70: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
bb80: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
bb90: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
bba0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
bbb0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
bbc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
bbd0: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
bbe0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
bbf0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bc00: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
bc10: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
bc20: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
bc30: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
bc40: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
bc70: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
bca0: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
bcb0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
bcc0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bce0: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
bcf0: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
bd00: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
bd10: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
bd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
bd30: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
bd40: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
bd50: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
bd80: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
bd90: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
bda0: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
bdb0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
bdc0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
bdd0: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
bde0: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
bdf0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
be00: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
be10: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
be20: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
be30: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
be40: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
be50: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
be60: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
be70: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
be80: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
be90: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
bea0: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
beb0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
bec0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
bed0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
bee0: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
bef0: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
bf00: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
bf10: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
bf20: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
bf30: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
bf40: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
bf50: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
bf60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
bf70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
bf80: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
bf90: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
bfa0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
bfb0: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
bfc0: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
bfd0: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
bfe0: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
bff0: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
c000: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
c010: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
c020: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
c030: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
c040: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
c050: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
c060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
c070: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
c080: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
c090: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
c0a0: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
c0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c0c0: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
c0d0: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
c0e0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
c0f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
c100: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
c110: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
c120: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
c130: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c140: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
c150: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
c160: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
c170: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
c180: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
c190: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
c1a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
c1b0: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
c1c0: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
c1d0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
c1e0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
c1f0: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
c200: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
c210: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
c220: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
c230: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n 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 0a 2a 2a 20 20 20 30 20 20 20 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 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
c2b0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
c2c0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
c2d0: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
c2e0: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
c2f0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
c300: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
c310: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
c320: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
c330: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
c340: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c350: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
c360: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
c370: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
c380: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
c390: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c3a0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
c3b0: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
c3c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c3d0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
c3e0: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
c3f0: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
c400: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
c410: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
c420: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
c430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
c440: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
c450: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
c460: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
c470: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
c480: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
c490: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
c4a0: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
c4b0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
c4c0: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
c4d0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
c4e0: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
c4f0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
c500: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
c510: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
c520: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
c530: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
c540: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
c550: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
c560: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
c570: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
c580: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
c590: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
c5a0: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
c5b0: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
c5c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c5d0: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
c5e0: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
c5f0: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
c600: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
c610: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
c620: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
c630: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
c640: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
c650: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
c660: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
c670: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
c680: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
c690: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
c6a0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
c6b0: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
c6c0: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
c6d0: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
c6e0: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
c6f0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
c700: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
c710: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
c720: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
c730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
c740: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
c750: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
c760: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c770: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
c780: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
c790: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
c7a0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
c7b0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
c7c0: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
c7d0: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
c7e0: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
c7f0: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
c800: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
c810: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
c820: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
c830: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
c840: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
c850: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c860: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_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 2f 2a 20 52 65 74 75 72 6e         /* Return
c890: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
c8a0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
c8b0: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
c8c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c8d0: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
c8e0: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
c8f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
c900: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
c910: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
c920: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
c930: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
c940: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
c950: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
c960: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
c970: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c980: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
c990: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
c9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
c9b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
c9c0: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
c9d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c9e0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
c9f0: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
ca00: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
ca10: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
ca20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ca30: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
ca40: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
ca50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
ca60: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
ca70: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
ca80: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
ca90: 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  _flags);.    }..
caa0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
cab0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
cac0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
cad0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
cae0: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
caf0: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
cb00: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
cb10: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
cb20: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
cb30: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
cb40: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
cb50: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
cb60: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
cb70: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
cb80: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
cb90: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
cba0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
cbb0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
cbc0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
cbd0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
cbe0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
cbf0: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
cc00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cc10: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
cc20: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
cc30: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
cc40: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
cc50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
cc60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
cc70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
cc80: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
cc90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
cca0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
ccb0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
ccc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ccd0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
cce0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
ccf0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
cd00: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
cd10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
cd20: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
cd30: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
cd40: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
cd50: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
cd60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
cd70: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
cd80: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
cd90: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
cda0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
cdb0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
cdc0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
cdd0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
cde0: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
cdf0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
ce00: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
ce10: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
ce20: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
ce30: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
ce40: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
ce50: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
ce60: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
ce70: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
ce80: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
ce90: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
cea0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
ceb0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
cec0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
ced0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
cee0: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
cef0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
cf00: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
cf10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
cf20: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
cf30: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
cf40: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
cf50: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
cf60: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
cf70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cfa0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
cfb0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
cfc0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
cfd0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
cfe0: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
cff0: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
d000: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
d010: 69 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  ize;     /* Size
d020: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
d030: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
d040: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
d050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
d070: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
d080: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
d090: 20 69 6e 74 20 69 69 3b 20 20 20 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 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d0c0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
d0d0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d0e0: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
d0f0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
d100: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
d110: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
d120: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d130: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
d140: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
d150: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d160: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
d170: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
d180: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
d190: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
d1a0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
d1b0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
d1c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d1d0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
d1e0: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
d1f0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
d200: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
d210: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
d220: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
d230: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
d240: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
d250: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
d260: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
d270: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
d280: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
d290: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
d2a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
d2b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
d2c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
d2d0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
d2e0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
d2f0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
d300: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
d310: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
d320: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
d330: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
d340: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
d350: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
d360: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
d370: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
d380: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
d390: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
d3a0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
d3b0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
d3c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
d3d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
d3e0: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
d3f0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
d400: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
d410: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
d420: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
d430: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
d440: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
d450: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
d460: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
d470: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
d480: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
d490: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
d4a0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
d4b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
d4c0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
d4d0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
d4e0: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
d4f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
d500: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
d510: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
d520: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
d530: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
d540: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
d550: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
d560: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
d570: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
d580: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
d590: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
d5a0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
d5b0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
d5c0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
d5d0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
d5e0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
d5f0: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
d600: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
d610: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
d620: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
d630: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
d640: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
d650: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
d660: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
d670: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
d680: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
d690: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
d6a0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
d6b0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
d6c0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
d6d0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
d6e0: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
d6f0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
d700: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
d710: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
d720: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
d730: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
d740: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
d750: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
d760: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
d770: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
d780: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
d790: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
d7a0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
d7b0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
d7c0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
d7d0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
d7e0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
d7f0: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
d800: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
d810: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
d820: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
d830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
d840: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
d850: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
d860: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
d870: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
d880: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
d890: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
d8a0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
d8b0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
d8c0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
d8d0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
d8e0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
d8f0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
d900: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
d910: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
d920: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
d930: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
d940: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
d950: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
d960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
d970: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
d980: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
d990: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
d9a0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
d9b0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
d9c0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
d9d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
d9e0: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
d9f0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
da00: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
da10: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
da20: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
da30: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
da40: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
da50: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
da60: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
da70: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
da80: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
da90: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
daa0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
dab0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
dac0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
dad0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
dae0: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
daf0: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
db00: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
db10: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
db20: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
db30: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
db40: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
db50: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
db60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
db70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
db80: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
db90: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
dba0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
dbb0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
dbc0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
dbd0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
dbe0: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
dbf0: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
dc00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
dc10: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
dc20: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
dc30: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
dc40: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
dc50: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
dc60: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
dc70: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
dc80: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
dc90: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
dca0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
dcb0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
dcc0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
dcd0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
dce0: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
dcf0: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
dd00: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
dd10: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
dd20: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
dd30: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
dd40: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
dd50: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
dd60: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
dd70: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
dd80: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
dd90: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
dda0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
ddb0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
ddc0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
ddd0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
dde0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
ddf0: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
de00: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
de10: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
de20: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
de30: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
de40: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
de50: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
de60: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
de70: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
de80: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
de90: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
dea0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
deb0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
dec0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
ded0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
dee0: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
def0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
df00: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
df10: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
df20: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
df30: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
df40: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
df50: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
df60: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
df70: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
df80: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
df90: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
dfa0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
dfb0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
dfc0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
dfd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
dfe0: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
dff0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
e000: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
e010: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
e020: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e030: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
e040: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
e050: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
e060: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
e070: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e080: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
e090: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
e0a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
e0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
e0c0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
e0d0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
e0e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e0f0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
e100: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
e110: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
e120: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
e130: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
e140: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
e150: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
e160: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e170: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
e180: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e190: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
e1a0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
e1b0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
e1c0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
e1d0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
e1e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
e1f0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
e200: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
e210: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
e220: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
e230: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
e240: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
e250: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
e260: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
e270: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
e280: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
e290: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
e2a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
e2b0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
e2c0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
e2d0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
e2e0: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
e2f0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
e300: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
e310: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
e320: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
e330: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
e340: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e350: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
e360: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
e370: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
e380: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
e390: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
e3a0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
e3b0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
e3c0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
e3d0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
e3e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e3f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
e400: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
e410: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
e420: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
e430: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
e440: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
e450: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
e460: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
e470: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
e480: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e490: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
e4a0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
e4b0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
e4c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
e4d0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
e4e0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
e4f0: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
e500: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e520: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
e530: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
e540: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
e550: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e580: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
e590: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
e5a0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
e5b0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
e5c0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
e5d0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
e5e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
e5f0: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
e600: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
e610: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e620: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e630: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e640: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e650: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
e660: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
e670: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
e680: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
e690: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
e6a0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
e6b0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
e6c0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
e6d0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
e6e0: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
e6f0: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
e700: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
e710: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e720: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
e730: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
e740: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
e750: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
e760: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
e770: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
e780: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e790: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
e7a0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
e7b0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
e7c0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
e7d0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
e7e0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
e7f0: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
e800: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
e810: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
e820: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
e830: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
e840: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
e850: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
e860: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
e870: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
e880: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
e890: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
e8a0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
e8b0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
e8c0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
e8d0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
e8e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
e8f0: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
e900: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
e910: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
e920: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
e930: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e940: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
e950: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
e960: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
e970: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
e980: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e990: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
e9a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
e9b0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
e9c0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
e9d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
e9e0: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
e9f0: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
ea00: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
ea10: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
ea20: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
ea30: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
ea40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
ea50: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
ea60: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
ea70: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
ea80: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
ea90: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
eaa0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
eab0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
eac0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
ead0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
eae0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
eaf0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
eb00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
eb10: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
eb20: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
eb30: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
eb40: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
eb50: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
eb60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
eb70: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
eb80: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
eb90: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
eba0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
ebb0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
ebc0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
ebd0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
ebe0: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
ebf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
ec00: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
ec10: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
ec20: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50 61  r */.    u16 iPa
ec30: 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20 20  geSize16;       
ec40: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
ec50: 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31 36   iPageSize in 16
ec60: 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a 2f  -bit variable */
ec70: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
ec80: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
ec90: 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72  sector-size jour
eca0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64  nal header field
ecb0: 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51  s. */.    if( SQ
ecc0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ecd0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ece0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ecf0: 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29  0, &iSectorSize)
ed00: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
ed10: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
ed20: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
ed30: 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26  d, iHdrOff+24, &
ed40: 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20  iPageSize)).    
ed50: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ed60: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
ed70: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
ed80: 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
ed90: 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  m the page-size 
eda0: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
edb0: 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72  fields.    ** ar
edc0: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
edd0: 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27  To be 'in range'
ede0: 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65  , both values ne
edf0: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
ee00: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67  .    ** of two g
ee10: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
ee20: 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33  qual to 512 or 3
ee30: 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
ee40: 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
ee50: 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
ee60: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
ee70: 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
ee80: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
ee90: 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
eeb0: 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20  SectorSize<32.  
eec0: 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e     || iPageSize>
eed0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
eee0: 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53  SIZE || iSectorS
eef0: 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
ef00: 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50  IZE.     || ((iP
ef10: 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
ef20: 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28  Size)!=0   || ((
ef30: 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69  iSectorSize-1)&i
ef40: 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a  SectorSize)!=0 .
ef50: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
ef60: 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68  If the either th
ef70: 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73  e page-size or s
ef80: 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68  ector-size in th
ef90: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
efa0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
efb0: 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20  valid, then the 
efc0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
efd0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  te the journal-h
efe0: 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20  eader must have 
eff0: 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65  .      ** crashe
f000: 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61  d before the hea
f010: 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20  der was synced. 
f020: 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f  In this case sto
f030: 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20  p reading .     
f040: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
f050: 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
f060: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
f070: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f080: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
f090: 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  te the page-size
f0a0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
f0b0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f0c0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  e journal. .    
f0d0: 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73  ** Use a testcas
f0e0: 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b  e() macro to mak
f0f0: 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c  e sure that mall
f100: 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69  oc failure withi
f110: 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53  n .    ** PagerS
f120: 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20  etPagesize() is 
f130: 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tested..    */. 
f140: 20 20 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d     iPageSize16 =
f150: 20 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b   (u16)iPageSize;
f160: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f170: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
f180: 65 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65  e(pPager, &iPage
f190: 53 69 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20  Size16, -1);.   
f1a0: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
f1b0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
f1c0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f1d0: 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69  TE_OK || iPageSi
f1e0: 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65  ze16==(u16)iPage
f1f0: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
f200: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
f210: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
f220: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
f230: 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
f240: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
f250: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
f260: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
f270: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
f280: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
f290: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
f2a0: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
f2b0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
f2c0: 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
f2d0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
f2e0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
f2f0: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
f300: 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
f310: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
f320: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
f330: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
f340: 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
f350: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
f360: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
f370: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
f380: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f390: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
f3a0: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
f3b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
f3c0: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
f3d0: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
f3e0: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
f3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
f400: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
f410: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
f420: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
f430: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
f440: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
f450: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
f460: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
f470: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
f480: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
f490: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
f4a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
f4b0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
f4c0: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
f4d0: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
f4e0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
f4f0: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
f500: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
f510: 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
f520: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
f530: 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
f540: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
f550: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
f560: 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
f570: 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
f580: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f590: 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
f5a0: 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
f5b0: 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
f5c0: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
f5d0: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
f5e0: 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
f5f0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
f600: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
f610: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
f620: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
f630: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
f640: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
f650: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
f660: 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
f670: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
f680: 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
f690: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
f6a0: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
f6b0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
f6c0: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
f6d0: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
f6e0: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
f6f0: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
f700: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
f710: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
f720: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
f730: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
f740: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
f750: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f770: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f780: 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
f7b0: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
f7c0: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f7f0: 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
f800: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
f810: 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f830: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
f840: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
f850: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
f880: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
f890: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
f8a0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
f8b0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
f8c0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
f8d0: 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
f8e0: 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
f8f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
f900: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
f910: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
f920: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
f930: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
f940: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
f950: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
f960: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f970: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
f980: 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ter = 1;.  asser
f990: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f9a0: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65  ->jfd) );.  asse
f9b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f9c0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f9d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f9e0: 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
f9f0: 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
fa00: 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
fa10: 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
fa20: 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
fa30: 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
fa40: 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
fa50: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
fa60: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
fa70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
fa80: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
fa90: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
faa0: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
fab0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
fac0: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
fad0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
fae0: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
faf0: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
fb00: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
fb10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
fb20: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
fb30: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
fb40: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
fb50: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
fb60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
fb70: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
fb80: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
fb90: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
fba0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
fbb0: 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
fbc0: 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
fbd0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
fbe0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
fbf0: 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
fc00: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
fc10: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
fc20: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
fc30: 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
fc40: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
fc50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc60: 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
fc70: 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
fc80: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
fc90: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
fca0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
fcb0: 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
fcc0: 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
fcd0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
fce0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
fcf0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
fd00: 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
fd10: 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
fd20: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
fd30: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fd40: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
fd50: 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
fd60: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
fd70: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
fd80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
fd90: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48  rnalMagic, 8, iH
fda0: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
fdb0: 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  8))).  ){.    re
fdc0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
fdd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fde0: 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30  f += (nMaster+20
fdf0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
fe00: 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69  pager is in peri
fe10: 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
fe20: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79  de, then the phy
fe30: 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72  sical .  ** jour
fe40: 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74  nal-file may ext
fe50: 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
fe60: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
fe70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a  ournal name.  **
fe80: 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20   and 8 bytes of 
fe90: 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20  magic data just 
fea0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
feb0: 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20  ile. This is .  
fec0: 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63  ** dangerous bec
fed0: 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f  ause the code to
fee0: 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d   rollback a hot-
fef0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
ff00: 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  * will not be ab
ff10: 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  le to find the m
ff20: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
ff30: 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
ff40: 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
ff50: 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
ff60: 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20   is hot. .  **. 
ff70: 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e   ** Easiest thin
ff80: 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20  g to do in this 
ff90: 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74  scenario is to t
ffa0: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
ffb0: 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74  nal .  ** file t
ffc0: 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73  o the required s
ffd0: 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ize..  */ .  if(
ffe0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
fff0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
10000 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
10010 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20   &jrnlSize)).   
10020 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67  && jrnlSize>pPag
10030 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
10040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
10050 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
10060 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
10070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
10080 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
100a0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
100b0 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
100c0 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
100d0 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
100e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
100f0 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72  or NULL if the r
10100 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
10110 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79   not .** already
10120 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   in memory..*/.s
10130 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
10140 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
10150 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
10160 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10190 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f  rn value */..  /
101a0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
101b0 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20  ible for a call 
101c0 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29  to PcacheFetch()
101d0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
101e0 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c  ==0 to.  ** fail
101f0 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d  , since no attem
10200 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64  pt to allocate d
10210 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69  ynamic memory wi
10220 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ll be made..  */
10230 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
10240 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
10250 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
10260 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74  o, 0, &p);.  ret
10270 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
10280 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69  Discard the enti
10290 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
102a0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  he in-memory pag
102b0 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74  e-cache..*/.stat
102c0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
102d0 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
102e0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63  r){.  sqlite3Bac
102f0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
10300 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73  r->pBackup);.  s
10310 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
10320 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
10330 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  e);.}../*.** Fre
10340 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  e all structures
10350 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
10360 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
10370 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a   and set both.**
10380 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
10390 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76  t and Pager.nSav
103a0 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20  epoint to zero. 
103b0 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f  Close the sub-jo
103c0 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69  urnal.** if it i
103d0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
103e0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
103f0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
10400 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
10410 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
10420 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
10430 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
10440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
10450 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69  erator for loopi
10460 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72  ng through Pager
10470 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  .aSavepoint */. 
10480 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
10490 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
104a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ; ii++){.    sql
104b0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
104c0 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
104d0 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
104e0 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  point);.  }.  if
104f0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
10500 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69  siveMode || sqli
10510 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
10520 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
10530 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
10540 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ose(pPager->sjfd
10550 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
10560 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53  _free(pPager->aS
10570 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61  avepoint);.  pPa
10580 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
10590 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
105a0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
105b0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
105c0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
105d0 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65  et the bit numbe
105e0 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61  r pgno in the Pa
105f0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
10600 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69  Savepoint .** bi
10610 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65  tvecs of all ope
10620 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65  n savepoints. Re
10630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
10640 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20  f successful.** 
10650 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
10660 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
10670 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ure occurs..*/.s
10680 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53  tatic int addToS
10690 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
106a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
106b0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
106c0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
106d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
106e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
106f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
10700 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
10710 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  code */..  for(i
10720 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
10730 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
10740 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
10750 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
10760 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
10770 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  i];.    if( pgno
10780 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20  <=p->nOrig ){.  
10790 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65      rc |= sqlite
107a0 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49  3BitvecSet(p->pI
107b0 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f  nSavepoint, pgno
107c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
107d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
107e0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  MEM );.      ass
107f0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
10800 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
10810 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a  _NOMEM );.    }.
10820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
10840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10850 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
10860 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
10870 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20  the pager.** is 
10880 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
10890 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
108a0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
108b0 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
108c0 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
108d0 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
108e0 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
108f0 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
10900 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
10910 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
10920 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
10930 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
10940 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
10950 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
10960 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
10970 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
10980 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
10990 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
109a0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
109b0 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
109c0 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
109d0 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
109e0 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
109f0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
10a00 7b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  {..  sqlite3Bitv
10a10 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
10a20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
10a30 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
10a40 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
10a50 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
10a60 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
10a70 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
10a80 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
10a90 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
10aa0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
10ab0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
10ac0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
10ad0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
10ae0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
10af0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
10b00 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
10b10 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
10b20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
10b50 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
10b60 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
10b70 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
10b80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
10b90 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
10ba0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
10bb0 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
10bc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
10bd0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
10be0 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
10bf0 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
10c00 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
10c10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
10c20 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
10c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
10c40 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
10c50 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
10c60 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
10c70 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
10c80 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
10c90 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
10ca0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
10cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10cc0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
10cd0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
10ce0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
10cf0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
10d00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
10d10 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
10d20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
10d30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
10d40 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
10d50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
10d60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10d70 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
10d80 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
10d90 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
10da0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
10db0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
10dc0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
10dd0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
10de0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
10df0 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
10e00 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
10e10 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
10e20 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
10e30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10e40 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
10e50 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
10e60 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
10e70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
10e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10e90 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
10ea0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
10eb0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
10ec0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
10ed0 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
10ee0 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
10ef0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
10f00 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
10f10 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
10f20 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
10f30 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
10f40 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
10f50 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
10f60 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
10f70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
10f80 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
10f90 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
10fa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10fb0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
10fc0 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
10fd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10fe0 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
10ff0 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
11000 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
11010 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
11020 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
11030 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
11040 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
11050 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
11060 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
11070 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
11080 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
11090 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
110a0 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
110b0 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
110c0 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
110d0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
110e0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
110f0 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
11100 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
11110 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
11120 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
11130 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
11140 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
11150 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
11160 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
11170 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
11180 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
11190 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
111a0 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
111b0 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
111c0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
111d0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
111e0 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
111f0 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
11200 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
11210 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
11220 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
11230 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
11240 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
11250 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
11260 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
11270 72 72 43 6f 64 65 20 26 26 20 21 4d 45 4d 44 42  rrCode && !MEMDB
11280 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
11290 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
112a0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
112b0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
112c0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20  r->tempFile;.   
112d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
112e0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
112f0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
11300 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
11310 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
11320 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
11330 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
11340 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  dr = 0;.  pPager
11350 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
11360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
11370 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
11380 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
11390 20 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20   IOERR, CORRUPT 
113a0 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a  or FULL error.**
113b0 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
113c0 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  ed. The first ar
113d0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
113e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
113f0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20   .** structure, 
11400 74 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65  the second the e
11410 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
11420 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
11430 79 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50  y a pager .** AP
11440 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
11450 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
11460 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
11470 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11480 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63  .** to this func
11490 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
114a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
114b0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
114c0 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
114d0 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46  UPT, or SQLITE_F
114e0 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ULL.** the error
114f0 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74   becomes persist
11500 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70  ent. Until the p
11510 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
11520 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
11530 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
11540 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
11550 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
11560 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
11570 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
11580 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
11590 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
115a0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
115b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
115c0 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
115d0 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
115e0 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
115f0 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
11600 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
11610 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
11620 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
11630 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
11640 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
11650 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
11660 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
11670 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
11680 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
11690 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
116a0 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
116b0 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
116c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
116d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
116e0 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
116f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
11700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
11710 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
11720 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
11730 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
11740 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
11750 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11760 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
11770 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
11780 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
11790 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
117a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
117b0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
117c0 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
117d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
117e0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
117f0 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
11800 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
11810 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
11820 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
11830 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
11840 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11850 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
11860 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
11870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
11880 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
11890 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
118a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
118b0 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
118c0 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
118d0 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
118e0 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
118f0 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
11900 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
11910 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
11920 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
11930 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
11940 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
11950 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
11960 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
11970 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
11980 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
11990 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
119a0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
119b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
119c0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
119d0 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
119e0 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63  tate. If it is c
119f0 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45  alled.** in PAGE
11a00 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f  R_NONE or PAGER_
11a10 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64  SHARED state and
11a20 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69   the lock held i
11a30 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73  s less.** exclus
11a40 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52  ive than a RESER
11a50 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  VED lock, it is 
11a60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f  a no-op..**.** O
11a70 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
11a80 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
11a90 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
11aa0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
11ab0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
11ac0 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
11ad0 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
11ae0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
11af0 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
11b00 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
11b10 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
11b20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
11b30 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
11b40 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
11b50 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
11b60 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
11b70 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
11b80 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
11b90 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
11ba0 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
11bb0 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
11bc0 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
11bd0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
11be0 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
11bf0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11c00 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
11c10 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
11c20 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
11c30 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
11c40 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
11c50 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
11c60 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
11c70 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
11c80 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
11c90 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
11ca0 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
11cb0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
11cc0 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
11cd0 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
11ce0 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
11cf0 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
11d00 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
11d10 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
11d20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
11d30 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
11d40 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
11d50 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
11d60 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
11d70 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
11d80 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
11d90 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
11da0 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
11db0 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
11dc0 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
11dd0 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
11de0 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
11df0 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
11e00 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
11e10 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
11e20 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
11e30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
11e40 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
11e50 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
11e60 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
11e70 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
11e80 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
11e90 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
11ea0 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
11eb0 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
11ec0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11ed0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
11ee0 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
11ef0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
11f00 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
11f10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11f20 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
11f30 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
11f40 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
11f50 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
11f60 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
11f70 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
11f80 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
11f90 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74   is finalized, t
11fa0 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
11fb0 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
11fc0 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e  tate..** If runn
11fd0 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
11fe0 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  sive rollback mo
11ff0 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  de, the lock on 
12000 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20  the file is .** 
12010 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
12020 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
12030 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
12040 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
12050 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
12060 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12070 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66  during.** any of
12080 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f   the IO operatio
12090 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ns to finalize t
120a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
120b0 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a  or unlock the.**
120c0 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74   database then t
120d0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
120e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
120f0 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65  the user. If the
12100 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74   .** operation t
12110 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
12120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
12130 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65  s, then the code
12140 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20   still.** tries 
12150 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
12160 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e  tabase file if n
12170 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
12180 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  mode. If the.** 
12190 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
121a0 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20   fails as well, 
121b0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65  then the first e
121c0 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65  rror code relate
121d0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
121e0 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
121f0 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c  red (the journal
12200 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e   finalization on
12210 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  e) is.** returne
12220 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12230 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
12240 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
12250 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
12260 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12270 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
12280 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
12290 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  rom journal fina
122a0 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  lization operati
122b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20  on */.  int rc2 
122c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
122d0 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
122e0 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f  rom db file unlo
122f0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ck operation */.
12300 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
12310 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f   if the pager do
12320 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f  es not have an o
12330 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
12340 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74  ction.  ** or at
12350 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
12360 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e  D lock. This fun
12370 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
12380 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20  led when there. 
12390 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d   ** is no write-
123a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
123b0 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45  ve but a RESERVE
123c0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
123d0 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75  k is.  ** held u
123e0 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73  nder two circums
123f0 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  tances:.  **.  *
12400 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73  *   1. After a s
12410 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f  uccessful hot-jo
12420 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
12430 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  it is called wit
12440 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61  h.  **      eSta
12450 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61  te==PAGER_NONE a
12460 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
12470 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20  IVE_LOCK..  **. 
12480 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f   **   2. If a co
12490 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f  nnection with lo
124a0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
124b0 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  sive holding an 
124c0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20  EXCLUSIVE .  ** 
124d0 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68       lock switch
124e0 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69  es back to locki
124f0 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61  ng_mode=normal a
12500 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73  nd then executes
12510 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61   a.  **      rea
12520 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  d-transaction, t
12530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12540 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61  called with eSta
12550 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
12560 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20   .  **      and 
12570 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
12580 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72  _LOCK when the r
12590 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
125a0 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a  is closed..  */.
125b0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
125c0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
125d0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
125e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
125f0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
12600 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
12610 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
12620 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61  ER_LOCKED && pPa
12630 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52  ger->eLock<RESER
12640 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
12650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12660 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  ;.  }..  release
12670 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
12680 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
12690 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
126a0 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
126b0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
126c0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
126d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
126e0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
126f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
12700 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
12710 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
12720 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
12730 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
12740 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  nal(pPager->jfd)
12750 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12760 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12770 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
12780 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
127a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
127b0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
127c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
127d0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
127e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
127f0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
12800 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12810 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
12820 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12830 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12840 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12850 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
12860 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
12870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
12880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
12890 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
128a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
128b0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
128c0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
128d0 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
128e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
128f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
12900 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
12910 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
12920 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
12930 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
12940 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
12950 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ter);.      pPag
12960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12970 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
12980 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
12990 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
129a0 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
129b0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
129c0 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
129d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
129e0 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
129f0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
12a00 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
12a10 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
12a20 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
12a30 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
12a40 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
12a50 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
12a60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
12a70 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
12a80 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
12a90 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  y journal. .    
12aa0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
12ab0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
12ac0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
12ad0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
12ae0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
12af0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12b00 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
12b10 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
12b20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
12b30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
12b40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
12b50 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
12b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
12b70 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
12b80 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
12b90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12bb0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
12bc0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
12bd0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
12be0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
12bf0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
12c00 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
12c10 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
12c20 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
12c30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
12c40 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
12c50 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
12c60 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
12c70 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
12c80 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
12c90 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
12ca0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
12cb0 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  c = 0;.  sqlite3
12cc0 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
12cd0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
12ce0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
12cf0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
12d00 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
12d10 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66  ->dbSize);..  if
12d20 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
12d30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
12d40 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69  Drop the WAL wri
12d50 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e  te-lock, if any.
12d60 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f   Also, if the co
12d70 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nnection was in 
12d80 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f  .    ** locking_
12d90 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
12da0 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f  ode but is no lo
12db0 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45  nger, drop the E
12dc0 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a  XCLUSIVE .    **
12dd0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
12de0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
12df0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20  .    */.    rc2 
12e00 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57  = sqlite3WalEndW
12e10 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
12e20 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
12e30 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d     assert( rc2==
12e40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
12e50 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12e60 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
12e70 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57    && (!pagerUseW
12e80 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71  al(pPager) || sq
12e90 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
12ea0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
12eb0 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20  al, 0)).  ){.   
12ec0 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f   rc2 = pagerUnlo
12ed0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
12ee0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
12ef0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12f00 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
12f10 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12f20 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
12f30 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
12f40 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74  ster = 0;..  ret
12f50 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
12f60 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
12f70 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
12f80 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
12f90 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
12fa0 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
12fb0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
12fc0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
12fd0 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
12fe0 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
12ff0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f   ERROR state, do
13000 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
13010 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
13020 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
13030 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
13040 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
13050 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
13060 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
13070 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
13080 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
13090 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
130a0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
130b0 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61  ove the pager ba
130c0 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
130d0 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65  . If this .** me
130e0 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
130f0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
13100 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
13110 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
13120 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  t .** connection
13130 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
13140 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
13150 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
13160 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a   be this one) .*
13170 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62  * will roll it b
13180 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
13190 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
131a0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
131b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
131c0 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
131d0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
131e0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
131f0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
13200 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
13210 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
13220 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
13230 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63  RROR state. Whic
13240 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
13250 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
13260 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
13270 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
13280 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
13290 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
132a0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
132b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
132c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
132d0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
132e0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
132f0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e!=PAGER_OPEN ){
13300 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
13310 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13320 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69  pPager) );.    i
13330 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
13340 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
13350 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
13360 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
13370 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
13380 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
13390 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
133a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
133b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
133c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
133d0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
133e0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Mode ){.      as
133f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13400 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
13410 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ER );.      page
13420 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
13430 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
13440 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f    }.  }.  pager_
13450 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
13460 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
13470 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
13480 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
13490 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
134a0 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
134b0 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
134c0 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
134d0 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
134e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
134f0 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
13500 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
13510 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
13520 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
13530 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
13540 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
13550 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
13560 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
13570 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
13580 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
13590 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
135a0 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
135b0 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
135c0 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
135d0 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
135e0 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
135f0 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
13600 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
13610 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
13620 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
13630 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
13640 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
13650 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
13660 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
13670 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
13680 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
13690 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
136a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
136b0 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
136c0 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
136d0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
136e0 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
136f0 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
13700 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
13710 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
13720 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
13730 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
13740 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
13750 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
13760 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
13770 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
13780 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
13790 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
137a0 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
137b0 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
137c0 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
137d0 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
137e0 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
137f0 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
13800 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
13810 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
13820 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
13830 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
13840 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
13850 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
13860 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
13870 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
13880 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
13890 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
138a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
138b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
138c0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
138d0 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
138e0 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
138f0 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
13900 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13910 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
13920 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
13930 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
13940 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
13950 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
13960 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
13970 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
13980 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
13990 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
139a0 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
139b0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
139c0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
139d0 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
139e0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
139f0 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
13a00 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13a10 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13a30 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
13a40 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
13a50 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
13a60 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
13a70 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
13a80 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
13a90 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
13aa0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
13ab0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
13ac0 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
13ad0 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
13ae0 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
13af0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
13b00 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
13b10 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
13b20 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
13b30 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
13b40 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
13b50 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
13b60 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
13b70 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
13b80 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
13b90 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
13ba0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
13bb0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
13bc0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
13bd0 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
13be0 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
13bf0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
13c00 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
13c10 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
13c20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
13c30 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
13c40 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
13c50 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
13c60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
13c70 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
13c80 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
13c90 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
13ca0 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
13cb0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
13cc0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
13cd0 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
13ce0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
13cf0 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
13d00 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
13d10 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
13d20 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
13d30 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
13d40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
13d50 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
13d60 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
13d70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
13d80 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
13d90 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
13da0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
13db0 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
13dc0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
13dd0 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
13de0 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
13df0 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
13e00 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
13e10 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
13e20 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
13e30 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
13e40 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
13e50 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
13e60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13e70 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
13e80 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
13e90 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
13ea0 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
13eb0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
13ec0 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
13ed0 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
13ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
13ef0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
13f00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
13f10 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
13f20 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
13f30 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
13f40 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
13f50 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
13f60 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
13f70 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
13f80 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
13f90 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
13fa0 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
13fb0 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
13fc0 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
13fd0 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
13fe0 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
13ff0 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
14000 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
14010 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
14020 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
14030 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
14040 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
14050 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
14060 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
14070 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
14080 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
14090 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
140a0 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
140b0 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
140c0 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
140d0 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
140e0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
140f0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
14100 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
14110 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
14120 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
14130 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
14140 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
14150 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
14160 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
14170 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
14180 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
14190 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
141a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
141b0 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
141c0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
141d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
141e0 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
141f0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
14200 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
14210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14220 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
14230 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
14240 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14260 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
14270 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
14280 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
14290 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
142a0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
142b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
142c0 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
142d0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
142e0 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
142f0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
14300 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
14310 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
14320 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
14330 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
14340 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
14350 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
14360 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
14370 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
14380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14390 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
143a0 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
143b0 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
143e0 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
143f0 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
14400 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
14410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14420 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
14430 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
14440 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
14450 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
14460 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
14470 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
14480 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
14490 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
144c0 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
144d0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
144e0 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
144f0 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
14500 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
14510 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
14520 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
14530 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
14540 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
14550 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
14560 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
14570 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
14580 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
14590 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
145a0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
145b0 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
145c0 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
145d0 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
145e0 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
145f0 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
14600 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
14610 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
14620 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
14630 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
14640 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
14650 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
14660 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
14670 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
14680 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
14690 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
146a0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
146b0 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20  tate is greater 
146c0 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45  than PAGER_WRITE
146d0 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72  R_CACHEMOD (a tr
146e0 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
146f0 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
14700 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68  lback done at th
14710 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65  e request of the
14720 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73   caller) or this
14730 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   is.  ** a hot-j
14740 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
14750 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d   If it is a hot-
14760 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
14770 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  , the pager.  **
14780 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45   is in state OPE
14790 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45  N and holds an E
147a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48  XCLUSIVE lock. H
147b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
147c0 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ack.  ** only re
147d0 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ads from the mai
147e0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74  n journal, not t
147f0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
14800 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
14810 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14820 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
14830 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28  EMOD.       || (
14840 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
14850 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
14860 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
14870 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
14880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
14890 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
148a0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
148b0 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  D || isMainJrnl 
148c0 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
148d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
148e0 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
148f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
14900 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
14910 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
14920 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
14930 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
14940 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
14950 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
14960 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
14970 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
14980 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
14990 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
149a0 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
149b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
149c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
149d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
149e0 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
149f0 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
14a00 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
14a10 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
14a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
14a30 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
14a40 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
14a50 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
14a60 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
14a70 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
14a80 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
14a90 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
14aa0 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
14ab0 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
14ac0 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
14ad0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
14ae0 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
14af0 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
14b00 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
14b10 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
14b20 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
14b30 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
14b40 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
14b50 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
14b60 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
14b70 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
14b80 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
14b90 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
14ba0 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
14bb0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
14bc0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
14bd0 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
14be0 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
14bf0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
14c00 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
14c10 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
14c20 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
14c30 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
14c40 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
14c50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14c60 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
14c70 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
14c80 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
14c90 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
14ca0 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
14cb0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14cc0 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
14cd0 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
14ce0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
14cf0 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
14d00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14d10 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
14d20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
14d30 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
14d40 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20   been played by 
14d50 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68  before during th
14d60 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72  e current.  ** r
14d70 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f  ollback, then do
14d80 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c  n't bother to pl
14d90 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e  ay it back again
14da0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f  ..  */.  if( pDo
14db0 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69  ne && (rc = sqli
14dc0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f  te3BitvecSet(pDo
14dd0 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49  ne, pgno))!=SQLI
14de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
14df0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
14e00 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62  * When playing b
14e10 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74  ack page 1, rest
14e20 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76 65  ore the nReserve
14e30 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20   setting.  */.  
14e40 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70  if( pgno==1 && p
14e50 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21  Pager->nReserve!
14e60 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30  =((u8*)aData)[20
14e70 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ] ){.    pPager-
14e80 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75 38  >nReserve = ((u8
14e90 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20  *)aData)[20];.  
14ea0 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
14eb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
14ec0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
14ed0 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
14ee0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
14ef0 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
14f00 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
14f10 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
14f20 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
14f30 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
14f40 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
14f50 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
14f60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
14f70 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
14f80 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
14f90 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
14fa0 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
14fb0 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
14fc0 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
14fd0 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
14fe0 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
14ff0 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
15000 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
15010 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
15020 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
15030 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
15040 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
15050 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
15060 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
15070 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
15080 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
15090 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
150a0 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
150b0 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
150c0 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
150d0 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
150e0 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
150f0 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
15100 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
15110 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
15120 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
15130 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
15140 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
15150 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
15160 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
15170 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
15180 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
15190 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
151a0 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
151b0 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
151c0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
151d0 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
151e0 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
151f0 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
15200 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
15210 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
15220 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
15230 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
15240 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
15250 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
15260 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
15270 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
15280 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
15290 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
152a0 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
152b0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
152c0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
152d0 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
152e0 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
152f0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
15300 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
15310 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
15320 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
15330 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
15340 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
15350 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
15360 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
15370 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
15380 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
15390 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
153a0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
153b0 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
153c0 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
153d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
153e0 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
153f0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
15400 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
15410 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
15420 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
15430 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
15440 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
15450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15460 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
15470 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
15480 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
15490 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
154a0 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
154b0 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
154c0 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
154d0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
154e0 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
154f0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
15500 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
15510 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
15520 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
15530 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
15540 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
15550 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
15560 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
15570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15580 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
15590 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
155a0 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
155b0 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
155c0 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
155d0 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
155e0 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
155f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
15600 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
15610 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15620 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
15630 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
15640 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
15650 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
15660 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
15670 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15680 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
15690 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
156a0 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
156b0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
156c0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
156d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
156e0 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
156f0 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
15700 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44  ageSize, (u8*)aD
15710 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
15720 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
15730 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
15740 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
15750 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
15760 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  l ){.    isSynce
15770 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  d = pPager->noSy
15780 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20  nc || (*pOffset 
15790 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
157a0 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  alHdr);.  }else{
157b0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
157c0 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
157d0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
157e0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20  R_NEED_SYNC));. 
157f0 20 7d 0a 20 20 69 66 28 20 28 70 50 61 67 65 72   }.  if( (pPager
15800 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15810 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
15820 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
15830 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
15840 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
15850 3e 66 64 29 0a 20 20 20 26 26 20 69 73 53 79 6e  >fd).   && isSyn
15860 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ced.  ){.    i64
15870 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
15880 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
15890 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74  geSize;.    test
158a0 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74  case( !isSavepnt
158b0 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70   && pPg!=0 && (p
158c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
158d0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b  NEED_SYNC)!=0 );
158e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
158f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
15900 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
15910 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
15920 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
15930 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
15940 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
15950 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
15960 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
15970 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15980 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
15990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
159a0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
159b0 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
159c0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
159d0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
159e0 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
159f0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
15a00 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
15a10 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
15a20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
15a30 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
15a40 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
15a50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
15a60 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
15a70 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
15a80 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
15a90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
15aa0 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
15ab0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
15ac0 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
15ad0 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
15ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
15af0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
15b00 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
15b10 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
15b20 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
15b30 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
15b40 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
15b50 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
15b60 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
15b70 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
15b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15b90 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
15ba0 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
15bb0 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
15bc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
15bd0 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
15be0 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
15bf0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
15c00 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
15c10 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
15c20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
15c30 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
15c40 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
15c50 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
15c60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
15c70 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
15c80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
15c90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
15ca0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
15cb0 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
15cc0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
15cd0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
15ce0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
15cf0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
15d00 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
15d10 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
15d20 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
15d30 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
15d40 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
15d50 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
15d60 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
15d70 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
15d80 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
15d90 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
15da0 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
15db0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
15dc0 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
15dd0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
15de0 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
15df0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
15e00 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
15e10 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
15e20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
15e30 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
15e40 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
15e50 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
15e60 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
15e70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
15e80 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
15e90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
15ea0 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  otSpill==1 );.  
15eb0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
15ec0 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  pill--;.    if( 
15ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
15ef0 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
15f00 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
15f10 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15f20 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
15f30 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
15f40 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
15f50 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
15f60 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
15f70 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
15f80 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
15f90 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
15fa0 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
15fb0 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
15fc0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
15fd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
15fe0 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
15ff0 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
16000 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
16010 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
16020 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
16030 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
16040 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
16050 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
16060 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
16070 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
16080 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
16090 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
160a0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
160b0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
160c0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
160d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
160e0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
160f0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
16100 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
16110 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
16120 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
16130 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
16140 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16150 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
16160 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
16170 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
16180 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
16190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
161a0 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
161b0 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
161c0 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
161d0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
161e0 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
161f0 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
16200 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
16210 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
16220 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
16230 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
16240 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
16250 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
16260 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
16270 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16280 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
16290 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
162a0 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
162b0 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
162c0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
162d0 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
162e0 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
162f0 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
16300 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
16310 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
16320 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
16330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
16340 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
16350 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
16360 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
16370 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
16380 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
16390 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
163a0 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
163b0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
163c0 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
163d0 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
163e0 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
163f0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
16400 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
16410 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
16420 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
16430 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
16440 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
16450 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
16460 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
16470 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
16480 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
16490 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
164a0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
164b0 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
164c0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
164d0 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
164e0 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
164f0 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
16500 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
16510 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
16520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16530 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
16540 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
16550 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
16560 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
16570 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
16580 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
16590 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
165a0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
165b0 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
165c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
165d0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
165e0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
165f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
16600 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
16610 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
16620 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
16630 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
16640 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
16650 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
16660 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
16670 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
16680 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
16690 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
166a0 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
166b0 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
166c0 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
166d0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
166e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
166f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16700 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
16710 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
16720 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
16730 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
16740 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
16750 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
16760 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
16770 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
16780 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
16790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
167a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
167b0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
167c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
167d0 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
167e0 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
167f0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
16800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
16810 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
16820 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
16830 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
16840 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
16850 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
16860 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
16870 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
16880 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
16890 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
168a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
168b0 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
168c0 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
168d0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
168e0 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
168f0 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
16900 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
16910 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
16920 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
16930 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
16940 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
16950 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
16960 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
16970 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
16980 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
16990 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
169a0 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
169b0 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
169c0 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
169d0 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
169e0 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
169f0 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
16a00 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
16a10 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
16a20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
16a30 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
16a40 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
16a50 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
16a60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
16a70 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
16a80 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
16a90 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
16aa0 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
16ab0 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
16ac0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
16ad0 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
16ae0 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
16af0 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
16b00 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
16b10 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
16b20 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
16b30 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
16b40 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
16b50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
16b60 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
16b70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
16b80 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
16b90 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
16ba0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
16bb0 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
16bc0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
16bd0 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
16be0 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
16bf0 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
16c00 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
16c10 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
16c20 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
16c30 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
16c40 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
16c50 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
16c60 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
16c70 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
16c80 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
16c90 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
16ca0 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
16cb0 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
16cc0 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
16cd0 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
16ce0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
16cf0 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
16d00 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
16d10 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
16d20 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
16d30 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
16d40 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
16d50 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
16d60 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
16d70 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
16d80 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
16d90 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
16da0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
16db0 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
16dc0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
16dd0 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
16de0 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
16df0 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
16e00 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
16e10 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
16e20 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
16e30 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
16e40 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
16e50 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
16e60 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
16e70 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
16e80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
16e90 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
16ea0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
16eb0 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
16ec0 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
16ed0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
16ee0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
16ef0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
16f00 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
16f10 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
16f20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
16f30 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
16f40 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
16f50 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
16f60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16f70 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
16f80 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
16f90 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
16fa0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
16fb0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
16fc0 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16ff0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
17000 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
17010 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
17020 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
17030 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
17040 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
17050 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
17060 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
17070 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
17080 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
17090 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
170a0 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
170b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
170c0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
170d0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
170e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
170f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17100 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
17110 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
17120 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
17130 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
17140 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
17150 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
17160 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
17170 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
17180 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
17190 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
171a0 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
171b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
171c0 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
171d0 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
171e0 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
171f0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
17200 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
17210 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
17220 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
17230 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
17240 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
17250 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17260 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
17270 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
17280 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
17290 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
172a0 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
172b0 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
172c0 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
172d0 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
172e0 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
172f0 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
17300 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
17310 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
17330 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
17340 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
17350 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
17360 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
17370 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
17380 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
17390 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
173a0 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
173b0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
173c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
173d0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
173e0 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
173f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17400 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
17410 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
17420 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
17430 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
17440 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
17450 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
17460 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
17470 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
17480 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
17490 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
174a0 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
174b0 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
174c0 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
174d0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
174e0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
174f0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
17500 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
17510 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
17520 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17530 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
17540 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
17550 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
17560 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
17570 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
17580 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
17590 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
175a0 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
175b0 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
175c0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
175d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
175e0 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
175f0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
17600 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
17610 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
17620 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
17630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17640 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
17650 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
17660 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
17670 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
17680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
17690 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
176a0 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
176b0 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
176c0 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
176d0 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
176e0 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
176f0 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
17700 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
17710 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
17720 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
17730 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
17740 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
17750 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
17760 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
17770 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17790 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
177a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
177b0 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
177c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
177d0 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
177e0 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
177f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
17800 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
17810 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
17820 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
17830 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
17840 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
17850 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
17860 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
17870 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17880 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
17890 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
178a0 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
178b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
178c0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
178d0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
178e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
178f0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
17900 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
17910 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
17920 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
17940 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
17950 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17960 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
17970 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
17980 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
17990 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
179a0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
179b0 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
179c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
179d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
179e0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
179f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17a00 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
17a10 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
17a20 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
17a30 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
17a40 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
17a50 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
17a60 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
17a70 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
17a80 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
17a90 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
17aa0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
17ab0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
17ac0 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
17ad0 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
17ae0 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
17af0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
17b00 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
17b10 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
17b20 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
17b30 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
17b40 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
17b50 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
17b60 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
17b70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
17b80 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
17b90 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
17ba0 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
17bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17bc0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
17bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17be0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17bf0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
17c00 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
17c10 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
17c20 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
17c30 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
17c40 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
17c50 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
17c60 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
17c70 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
17c80 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
17c90 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
17ca0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
17cb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
17cc0 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
17cd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
17ce0 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e   not open, or an
17cf0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
17d00 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20  is not.** held, 
17d10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17d20 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
17d30 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66  ise, the size of
17d40 20 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20   the file is.** 
17d50 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
17d60 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
17d70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
17d80 79 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69  ytes). If the fi
17d90 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73  le.** on disk is
17da0 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
17db0 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67  r than nPage pag
17dc0 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65  es, then use the
17dd0 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74   VFS.** xTruncat
17de0 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72  e() method to tr
17df0 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  uncate it..**.**
17e00 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69   Or, it might mi
17e10 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
17e20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
17e30 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
17e40 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
17e50 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
17e60 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
17e70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
17e80 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
17e90 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
17ea0 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
17eb0 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
17ec0 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
17ed0 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
17ee0 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
17ef0 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
17f00 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
17f10 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
17f20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
17f30 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
17f40 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
17f50 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
17f60 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
17f70 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
17f80 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
17f90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17fa0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
17fb0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
17fc0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
17fd0 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
17fe0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
17ff0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
18000 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18010 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
18020 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
18030 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
18040 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18050 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52  >eState!=PAGER_R
18060 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66  EADER );.  .  if
18070 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18080 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61  >fd) .   && (pPa
18090 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
180a0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
180b0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
180c0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a  e==PAGER_OPEN) .
180d0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72    ){.    i64 cur
180e0 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
180f0 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  e;.    /* TODO: 
18100 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
18110 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
18120 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
18130 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
18140 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
18150 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
18160 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
18170 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18180 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
18190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
181a0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
181b0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
181c0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
181d0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
181e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
181f0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
18200 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
18210 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
18220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18230 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
18240 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20  ger->fd, "", 1, 
18250 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  newSize-1);.    
18260 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
18270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18280 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
18290 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
182a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
182b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
182c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
182d0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
182e0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
182f0 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
18300 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
18310 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
18320 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
18330 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
18340 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
18350 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
18360 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
18370 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
18380 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
18390 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
183a0 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
183b0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
183c0 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
183d0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
183e0 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
183f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
18400 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
18410 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
18420 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
18430 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
18440 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
18450 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
18460 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
18470 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
18480 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
18490 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
184a0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
184b0 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
184c0 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
184d0 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
184e0 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
184f0 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
18500 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
18510 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
18520 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
18530 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  OR_SIZE..*/.stat
18540 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
18550 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
18560 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
18570 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18580 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
18590 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
185a0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
185b0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
185c0 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
185d0 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
185e0 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
185f0 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
18600 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
18610 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
18620 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
18630 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
18640 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
18650 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
18660 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
18670 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
18680 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
18690 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
186a0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
186b0 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b  sectorSize<32 ){
186c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
186d0 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
186e0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
186f0 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  >sectorSize>MAX_
18700 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
18710 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
18720 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
18730 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
18740 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f  ectorSize = MAX_
18750 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
18760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
18770 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
18780 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
18790 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
187a0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
187b0 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
187c0 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
187d0 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
187e0 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
187f0 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
18800 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
18810 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
18820 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
18830 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
18840 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
18850 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
18860 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
18870 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
18880 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
18890 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
188a0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
188b0 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
188c0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
188d0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
188e0 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
188f0 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
18900 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
18910 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
18920 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
18930 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
18940 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
18950 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
18960 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
18970 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
18980 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
18990 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
189a0 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
189b0 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
189c0 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
189d0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
189e0 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
189f0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
18a00 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
18a10 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
18a20 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
18a30 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
18a40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
18a50 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
18a60 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
18a70 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
18a80 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
18a90 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
18aa0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
18ab0 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
18ac0 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
18ad0 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
18ae0 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
18af0 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
18b00 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
18b10 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
18b20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18b30 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
18b40 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
18b50 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
18b60 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
18b70 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
18b80 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
18b90 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
18ba0 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
18bb0 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
18bc0 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
18bd0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
18be0 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
18bf0 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
18c00 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
18c10 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
18c20 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18c30 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
18c40 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
18c50 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
18c60 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
18c70 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
18c80 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
18c90 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
18ca0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
18cb0 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
18cc0 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
18cd0 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
18ce0 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
18cf0 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
18d00 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
18d10 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
18d20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
18d30 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
18d40 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
18d50 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
18d60 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
18d70 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
18d80 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
18d90 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
18da0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
18db0 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
18dc0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
18dd0 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
18de0 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
18df0 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
18e00 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
18e10 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
18e20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
18e30 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
18e40 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
18e50 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
18e60 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
18e70 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
18e80 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
18e90 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
18ea0 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
18eb0 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
18ec0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
18ed0 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
18ee0 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
18ef0 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
18f00 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
18f10 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
18f20 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
18f30 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
18f40 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
18f50 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
18f60 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
18f70 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
18f80 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
18f90 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
18fa0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
18fb0 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
18fc0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
18fd0 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
18fe0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
18ff0 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
19000 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
19010 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
19020 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
19030 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
19040 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
19050 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
19060 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
19070 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
19080 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
19090 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
190a0 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
190b0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
190c0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
190d0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
190e0 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
190f0 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
19100 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19110 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
19120 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
19130 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
19140 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
19150 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
19160 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
19170 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
19180 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
19190 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
191a0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
191b0 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
191c0 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
191d0 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
191e0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
191f0 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
19200 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
19210 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
19220 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
19230 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
19240 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
19250 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
19260 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
19270 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
19280 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
19290 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
192a0 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
192b0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
192c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
192d0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
192e0 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
192f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19300 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
19310 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
19320 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
19330 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
19340 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19350 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
19360 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
19370 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
19380 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
19390 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
193a0 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
193b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
193c0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
193d0 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
193e0 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
19410 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
19420 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
19430 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
19440 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
19450 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
19460 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
19470 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
19480 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
19490 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
194a0 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
194b0 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
194c0 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
194d0 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
194e0 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
194f0 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20  e rollback */.. 
19500 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
19510 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
19520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19530 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  K;.  }..  /* Fig
19540 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
19550 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
19560 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
19570 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
19580 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
19590 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72   empty..  */.  r
195a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
195b0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
195c0 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
195d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
195e0 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
195f0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
19600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
19610 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19620 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
19630 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
19640 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
19650 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
19660 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
19670 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
19680 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
19690 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
196a0 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
196b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
196c0 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
196d0 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
196e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
196f0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65  **.  ** TODO: Te
19700 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f  chnically the fo
19710 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72  llowing is an er
19720 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61  ror because it a
19730 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a  ssumes that.  **
19740 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54   buffer Pager.pT
19750 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61  mpSpace is (mxPa
19760 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20  thname+1) bytes 
19770 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20  or larger. i.e. 
19780 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65  that.  ** (pPage
19790 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70  r->pageSize >= p
197a0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
197b0 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e  athname+1). Usin
197c0 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a  g os_unix.c,.  *
197d0 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73  *  mxPathname is
197e0 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74   512, which is t
197f0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d  he same as the m
19800 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  inimum allowable
19810 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20   value.  ** for 
19820 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20  pageSize..  */. 
19830 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
19840 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
19850 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
19860 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
19870 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
19880 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
19890 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20  hname+1);.  if( 
198a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
198b0 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
198c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
198d0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
198e0 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
198f0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
19900 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  s);.  }.  zMaste
19910 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
19920 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72  =SQLITE_OK || !r
19930 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  es ){.    goto e
19940 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
19950 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
19960 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65  alOff = 0;.  nee
19970 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73  dPagerReset = is
19980 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  Hot;..  /* This 
19990 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
199a0 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65  either when a re
199b0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f  adJournalHdr() o
199c0 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  r .  ** pager_pl
199d0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
199e0 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53  ) call returns S
199f0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
19a00 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20   IO error .  ** 
19a10 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20  occurs. .  */.  
19a20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
19a30 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
19a40 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
19a50 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
19a60 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
19a70 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
19a80 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
19a90 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
19aa0 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
19ab0 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
19ac0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
19ad0 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
19ae0 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
19af0 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
19b00 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
19b10 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
19b20 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
19b30 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
19b40 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
19b50 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
19b60 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
19b70 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
19b80 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
19b90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
19ba0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19bb0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
19bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19bd0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
19be0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
19bf0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
19c00 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
19c10 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
19c20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
19c30 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
19c40 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
19c50 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
19c60 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
19c70 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
19c80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
19c90 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
19ca0 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
19cb0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
19cc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
19cd0 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
19ce0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
19cf0 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
19d00 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
19d10 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
19d20 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
19d30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19d40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
19d50 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
19d60 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
19d70 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
19d80 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
19d90 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
19da0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
19db0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
19dc0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
19dd0 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
19de0 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
19df0 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
19e00 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
19e10 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
19e20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
19e30 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
19e40 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
19e50 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
19e60 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
19e70 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
19e80 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
19e90 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
19ea0 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
19eb0 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
19ec0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
19ed0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
19ee0 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
19ef0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
19f00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19f10 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
19f20 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
19f30 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
19f40 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
19f50 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
19f60 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
19f70 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
19f80 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
19f90 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
19fa0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19fb0 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
19fc0 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
19fd0 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
19fe0 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
19ff0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1a000 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1a010 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1a020 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1a030 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1a040 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1a050 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1a060 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1a070 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1a080 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1a090 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1a0a0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1a0b0 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1a0c0 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1a0d0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1a0e0 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1a0f0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1a100 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1a110 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a120 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1a130 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1a140 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1a150 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1a160 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1a170 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1a180 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1a190 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1a1a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1a1b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1a1c0 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1a1d0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1a1e0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1a1f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1a200 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1a210 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1a220 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1a230 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1a240 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1a250 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1a260 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1a270 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1a280 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1a290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a2a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1a2b0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1a2c0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1a2d0 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1a2e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1a2f0 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1a300 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1a310 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1a320 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1a330 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1a340 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1a350 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1a360 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1a370 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1a380 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1a390 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1a3a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1a3b0 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1a3c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1a3d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a3e0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1a3f0 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1a400 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1a410 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1a420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1a440 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1a450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1a460 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1a470 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1a480 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1a490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a4a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a4b0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1a4c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1a4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1a4e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1a4f0 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1a500 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1a510 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1a520 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1a530 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1a540 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1a550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1a560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1a570 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1a580 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1a590 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1a5a0 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1a5b0 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1a5c0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1a5d0 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1a5e0 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1a5f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1a600 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1a610 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1a620 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1a630 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1a640 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1a650 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1a660 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1a670 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a680 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1a690 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1a6a0 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1a6b0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1a6c0 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1a6d0 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1a6e0 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1a6f0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1a700 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1a710 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1a720 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1a730 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1a740 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1a750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1a760 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1a770 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1a780 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1a790 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1a7a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1a7b0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1a7c0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1a7d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a7e0 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1a7f0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1a800 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1a810 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1a820 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1a830 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1a840 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1a850 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1a860 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1a870 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1a880 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1a890 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1a8a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1a8b0 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1a8c0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1a8d0 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1a8e0 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1a8f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a900 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1a910 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ified..  */.  as
1a920 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72  sert(.    pPager
1a930 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  ->fd->pMethods==
1a940 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ||.    sqlite3
1a950 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
1a960 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1a970 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1a980 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b  ED,0)>=SQLITE_OK
1a990 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
1a9a0 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1a9b0 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1a9c0 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1a9d0 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1a9e0 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1a9f0 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1aa00 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1aa10 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1aa20 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1aa30 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1aa40 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1aa50 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1aa60 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1aa70 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1aa80 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1aa90 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1aaa0 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1aab0 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1aac0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1aad0 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1aae0 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1aaf0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1ab00 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1ab10 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1ab20 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1ab30 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1ab40 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1ab50 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1ab60 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1ab70 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1ab80 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1ab90 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1aba0 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1abb0 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1abc0 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1abd0 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1abe0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1abf0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1ac00 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1ac10 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1ac20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ac30 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1ac40 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1ac50 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1ac60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1ac70 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1ac80 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ac90 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1aca0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1acb0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1acc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1acd0 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
1ace0 53 79 6e 63 20 26 26 20 70 50 61 67 65 72 2d 3e  Sync && pPager->
1acf0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1ad00 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20  ITER_DBMOD ){.  
1ad10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ad20 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1ad30 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1ad40 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ags);.  }.  if( 
1ad50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ad60 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1ad70 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
1ad80 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1ad90 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 72 63  _DBMOD ){.    rc
1ada0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1adb0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
1adc0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
1add0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1ade0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1adf0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1ae00 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1ae10 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1ae20 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
1ae30 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1ae40 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1ae50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ae60 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1ae70 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1ae80 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1ae90 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1aea0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1aeb0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1aec0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1aed0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1aee0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1aef0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1af00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1af10 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1af20 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1af30 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1af40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1af50 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
1af60 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1af70 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
1af80 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
1af90 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
1afa0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
1afb0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1afc0 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
1afd0 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
1afe0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
1aff0 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
1b000 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
1b010 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
1b020 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1b030 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1b040 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1b050 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1b060 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75   for page pPg ou
1b070 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1b080 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20  e file and into 
1b090 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20  .** pPg->pData. 
1b0a0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72  A shared lock or
1b0b0 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
1b0c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1b0d0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65  abase.** file be
1b0e0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1b0f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
1b100 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73  .** If page 1 is
1b110 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20   read, then the 
1b120 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
1b130 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73  bFileVers[] is s
1b140 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c  et to.** the val
1b150 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
1b160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1b170 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
1b180 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1b190 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69  n the IO error i
1b1a0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1b1b0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68  e caller..** Oth
1b1c0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1b1d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
1b1e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
1b1f0 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70  dDbPage(PgHdr *p
1b200 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1b210 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1b220 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1b230 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1b240 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1b250 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1b260 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1b270 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1b280 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1b290 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1b2a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1b2b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1b2c0 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20  isInWal = 0;    
1b2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b2e0 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c   if page is in l
1b2f0 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  og file */.  int
1b300 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e   pgsz = pPager->
1b310 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d  pageSize; /* Num
1b320 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1b330 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
1b340 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1b350 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
1b360 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  && !MEMDB );.  a
1b370 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1b380 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
1b390 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65  if( NEVER(!isOpe
1b3a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
1b3b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1b3c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1b3d0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  ;.    memset(pPg
1b3e0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
1b3f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1b400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b410 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
1b420 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1b430 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  er) ){.    /* Tr
1b440 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61  y to pull the pa
1b450 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74  ge from the writ
1b460 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a  e-ahead log. */.
1b470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b480 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e  WalRead(pPager->
1b490 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49  pWal, pgno, &isI
1b4a0 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d  nWal, pgsz, pPg-
1b4b0 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69  >pData);.  }.  i
1b4c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b4d0 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a   && !isInWal ){.
1b4e0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1b4f0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1b500 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b510 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b520 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1b530 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1b540 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1b550 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b560 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1b570 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1b580 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b590 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1b5a0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1b5b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1b5c0 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1b5d0 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1b5e0 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1b5f0 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1b600 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1b610 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1b620 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1b630 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1b640 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1b650 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1b660 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1b670 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1b680 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1b690 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1b6a0 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1b6b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1b6c0 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1b6d0 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1b6e0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b6f0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1b700 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1b710 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1b720 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1b730 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1b740 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1b750 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1b760 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1b770 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1b780 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1b790 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1b7a0 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1b7b0 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1b7c0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1b7d0 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1b7e0 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1b7f0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1b800 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1b810 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
1b820 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1b830 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1b840 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1b850 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1b860 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1b870 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1b880 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1b890 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1b8a0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1b8b0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1b8c0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1b8d0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1b8e0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1b8f0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1b900 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1b910 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1b920 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1b930 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1b940 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1b950 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1b960 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1b970 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1b980 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1b990 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1b9a0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1b9b0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1b9c0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1b9d0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1b9e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1b9f0 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1ba00 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1ba10 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1ba20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ba30 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1ba40 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1ba50 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1ba60 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1ba70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ba80 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1ba90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1baa0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1bab0 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1bac0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1bad0 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1bae0 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1baf0 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1bb00 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1bb10 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1bb20 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1bb30 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1bb40 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1bb50 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1bb60 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1bb70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1bb80 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1bb90 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1bba0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1bbb0 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1bbc0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1bbd0 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1bbe0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1bbf0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1bc00 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1bc10 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1bc20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1bc30 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1bc40 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1bc50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1bc60 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1bc70 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1bc80 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1bc90 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1bca0 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1bcb0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1bcc0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1bcd0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1bce0 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1bcf0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1bd00 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1bd10 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1bd20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bd30 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1bd40 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1bd50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1bd60 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1bd70 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1bd80 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1bd90 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1bda0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1bdb0 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1bdc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1bdd0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1bde0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bdf0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1be00 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
1be10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1be20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1be30 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1be40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1be50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1be60 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ef(pPg);.    }. 
1be70 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1be80 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1be90 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1bea0 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1beb0 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1bec0 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1bed0 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1bee0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1bef0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1bf00 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1bf10 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1bf20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1bf30 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1bf40 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1bf50 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1bf60 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1bf70 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1bf80 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1bf90 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1bfa0 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1bfb0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1bfc0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1bfd0 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1bfe0 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1bff0 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1c000 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1c010 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1c020 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1c030 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1c040 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1c050 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1c060 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1c070 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1c080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c090 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c0a0 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1c0b0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1c0c0 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1c0d0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1c0e0 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1c0f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1c100 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  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 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1c130 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1c140 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1c150 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1c160 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1c170 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1c180 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1c190 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1c1a0 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1c1b0 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1c1c0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1c1d0 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1c1e0 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1c1f0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1c200 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1c210 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1c220 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1c230 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1c240 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1c250 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1c260 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1c270 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1c280 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1c290 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1c2a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c2b0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1c2c0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1c2d0 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1c2e0 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1c2f0 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1c300 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1c310 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1c320 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1c330 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1c340 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1c350 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c360 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1c370 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1c380 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1c390 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1c3a0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1c3b0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1c3c0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1c3d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c3f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1c400 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1c410 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1c420 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1c430 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
1c440 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
1c450 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
1c460 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
1c470 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
1c480 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1c490 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
1c4a0 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
1c4b0 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
1c4c0 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
1c4d0 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74 69  nged. .*/ .stati
1c4e0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1c4f0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1c500 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1c510 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1c520 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1c530 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c550 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1c560 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1c570 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1c580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1c590 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1c5a0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1c5b0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1c5e0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1c5f0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c 61  /.  int sync_fla
1c600 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1c610 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1c620 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1c630 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1c640 69 6e 74 20 72 63 3b 20 20 20 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 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c670 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1c680 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 72  ger->pWal );.  r
1c690 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1c6a0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1c6b0 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1c6c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1c6d0 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1c6e0 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c 61  Commit, sync_fla
1c6f0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1c700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1c710 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1c720 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1c730 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1c740 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1c750 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1c760 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1c770 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1c780 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1c790 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1c7a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c7b0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1c7c0 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1c7d0 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1c7e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1c7f0 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1c800 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1c810 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1c820 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1c830 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1c840 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1c850 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
1c860 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
1c870 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
1c880 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
1c890 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
1c8a0 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
1c8b0 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
1c8c0 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
1c8d0 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
1c8e0 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
1c8f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
1c900 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1c910 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
1c920 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  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 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c950 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
1c960 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
1c970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c980 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
1c990 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
1c9a0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1c9b0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
1c9c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1c9d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1c9e0 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
1c9f0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
1ca00 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
1ca10 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1ca20 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
1ca30 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
1ca40 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
1ca50 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
1ca60 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
1ca70 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
1ca80 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
1ca90 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
1caa0 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
1cab0 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
1cac0 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1cad0 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
1cae0 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
1caf0 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
1cb00 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1cb10 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1cb20 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
1cb30 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
1cb40 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1cb50 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
1cb60 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
1cb70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cb80 26 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  & changed ){.   
1cb90 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1cba0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
1cbb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cbc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1cbd0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1cbe0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1cbf0 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1cc00 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1cc10 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1cc20 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1cc30 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1cc40 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1cc50 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1cc60 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1cc70 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1cc80 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1cc90 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1cca0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1ccb0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1ccc0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1ccd0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1cce0 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1ccf0 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1cd00 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1cd10 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1cd20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1cd30 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1cd40 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1cd50 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1cd60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1cd70 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1cd80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1cd90 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1cda0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1cdd0 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1cde0 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1cdf0 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1ce00 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1ce10 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1ce20 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1ce30 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1ce40 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1ce50 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1ce60 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1ce70 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1ce80 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1ce90 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1cea0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1ceb0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1cec0 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1ced0 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1cee0 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1cef0 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1cf00 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1cf10 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1cf20 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1cf30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cf40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1cf50 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1cf60 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1cf70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
1cf80 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1cf90 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  ck );.  nPage = 
1cfa0 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1cfb0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1cfc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1cfd0 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e  abase size was n
1cfe0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
1cff0 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1d000 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72  stem,.  ** deter
1d010 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e  mine it based on
1d020 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1d040 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  If the size.  **
1d050 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d060 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20   file is not an 
1d070 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1d080 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1d090 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f  e,.  ** round do
1d0a0 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73  wn to the neares
1d0b0 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20  t page. Except, 
1d0c0 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20  any file larger 
1d0d0 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65  than 0.  ** byte
1d0e0 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
1d0f0 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61  sidered to conta
1d100 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
1d110 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1d120 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1d130 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d150 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1d160 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1d170 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1d180 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1d190 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1d1a0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1d1b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1d1c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1d1d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1d1e0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1d1f0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1d200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d210 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d230 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1d240 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1d250 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
1d260 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e  ( nPage==0 && n>
1d270 30 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  0 ){.      nPage
1d280 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1d290 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1d2a0 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1d2b0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1d2c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1d2d0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
1d2e0 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1d2f0 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1d300 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1d310 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1d320 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1d330 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1d340 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1d350 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1d360 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1d370 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1d380 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
1d390 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1d3a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1d3b0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
1d3c0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
1d3d0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1d3e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
1d3f0 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
1d400 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
1d410 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1d420 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
1d430 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
1d440 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
1d450 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
1d460 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
1d470 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
1d480 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
1d490 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1d4a0 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
1d4b0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1d4c0 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
1d4d0 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
1d4e0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1d4f0 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
1d500 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
1d510 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
1d520 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1d530 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
1d540 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
1d550 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
1d560 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1d570 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
1d580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
1d590 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1d5a0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1d5b0 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1d5c0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1d5d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1d5e0 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1d5f0 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1d600 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1d610 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1d620 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1d630 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1d640 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1d650 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1d660 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1d670 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1d680 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1d690 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1d6a0 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1d6b0 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1d6c0 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1d6d0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1d6e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d6f0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1d700 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1d710 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1d720 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1d730 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1d740 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1d750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1d760 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1d770 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  D_LOCK || pPager
1d780 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a  ->noReadlock );.
1d790 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1d7a0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1d7b0 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7d0 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
1d7e0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
1d7f0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d810 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
1d820 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1d830 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
1d840 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1d850 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
1d860 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1d870 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1d880 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1d890 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1d8a0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1d8b0 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
1d8c0 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
1d8d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d8e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1d8f0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
1d900 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
1d910 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
1d920 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1d930 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
1d940 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1d950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d960 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
1d970 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
1d980 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
1d990 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
1d9a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
1d9b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1d9c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1d9d0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
1d9e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1d9f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1da00 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
1da10 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
1da20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1da30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
1da40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1da50 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
1da60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1da70 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1da80 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1da90 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
1daa0 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
1dab0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
1dac0 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
1dad0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
1dae0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1daf0 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
1db00 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
1db10 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
1db20 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
1db30 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
1db40 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
1db50 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1db60 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
1db70 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
1db80 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
1db90 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
1dba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1dbb0 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
1dbc0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
1dbd0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
1dbe0 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
1dbf0 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
1dc00 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
1dc10 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
1dc20 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
1dc30 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
1dc40 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
1dc50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
1dc60 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
1dc70 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
1dc80 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
1dc90 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
1dca0 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
1dcb0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1dcc0 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
1dcd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1dce0 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
1dcf0 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
1dd00 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1dd10 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
1dd20 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
1dd30 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1dd40 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
1dd50 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1dd60 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
1dd70 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
1dd80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1dd90 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
1dda0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
1ddb0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
1ddc0 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
1ddd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1dde0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
1ddf0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
1de00 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
1de10 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
1de20 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
1de30 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
1de40 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
1de50 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
1de60 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1de70 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
1de80 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
1de90 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
1dea0 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
1deb0 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
1dec0 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
1ded0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
1dee0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1def0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
1df00 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
1df10 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
1df20 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
1df30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
1df40 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
1df50 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
1df60 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
1df70 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1df80 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1df90 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1dfa0 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
1dfb0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
1dfc0 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
1dfd0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1dfe0 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
1dff0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
1e000 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1e010 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1e020 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
1e030 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1e040 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
1e050 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
1e060 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
1e070 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
1e080 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
1e090 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
1e0a0 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
1e0b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1e0c0 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
1e0d0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
1e0e0 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
1e0f0 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
1e100 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
1e110 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
1e120 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
1e130 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
1e140 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
1e150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e160 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
1e170 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
1e180 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
1e190 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
1e1a0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e1c0 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
1e1d0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1e1e0 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
1e1f0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
1e200 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
1e210 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
1e220 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
1e230 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
1e240 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1e250 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e260 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
1e270 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1e280 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
1e290 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
1e2a0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
1e2b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e2c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1e2d0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1e2e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1e2f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1e300 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
1e310 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
1e320 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
1e330 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
1e340 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
1e350 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
1e360 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
1e370 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1e380 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
1e390 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
1e3a0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
1e3b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e3c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1e3d0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1e3e0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
1e3f0 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
1e400 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
1e410 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
1e420 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
1e430 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
1e440 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1e450 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
1e460 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
1e470 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
1e480 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
1e490 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1e4a0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1e4b0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
1e4c0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
1e4d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e4e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1e4f0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e500 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
1e510 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
1e520 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
1e530 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
1e540 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
1e550 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
1e560 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
1e570 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
1e580 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
1e590 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
1e5a0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1e5b0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
1e5c0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
1e5d0 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
1e5e0 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
1e5f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
1e600 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
1e610 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
1e620 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1e630 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e640 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
1e650 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
1e660 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
1e670 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
1e680 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
1e690 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
1e6a0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
1e6b0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
1e6c0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1e6d0 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
1e6e0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
1e6f0 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
1e700 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
1e710 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
1e720 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
1e730 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
1e740 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
1e750 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
1e760 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
1e770 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
1e780 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
1e790 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
1e7a0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
1e7b0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
1e7c0 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
1e7d0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
1e7e0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
1e7f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
1e800 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
1e810 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
1e820 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
1e830 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
1e840 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
1e850 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1e860 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
1e870 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
1e880 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1e890 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
1e8a0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
1e8b0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1e8c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1e8d0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
1e8e0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1e8f0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
1e900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1e910 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1e920 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
1e930 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1e940 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
1e950 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
1e960 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
1e970 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
1e980 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
1e990 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
1e9a0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
1e9b0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
1e9c0 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
1e9d0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
1e9e0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
1e9f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
1ea00 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
1ea10 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
1ea20 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
1ea30 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
1ea40 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
1ea50 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
1ea60 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1ea70 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
1ea80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
1ea90 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1eab0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1eac0 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
1ead0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1eae0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
1eaf0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
1eb00 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
1eb10 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1eb20 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
1eb30 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
1eb40 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1eb50 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
1eb60 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
1eb70 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
1eb80 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1eb90 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1eba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
1ebb0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
1ebc0 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
1ebd0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
1ebe0 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
1ebf0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
1ec00 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
1ec10 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
1ec20 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
1ec30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1ec40 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
1ec50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ec60 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1ec70 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1ec80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
1ec90 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
1eca0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
1ecb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ecc0 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
1ecd0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1ece0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
1ecf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ed00 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
1ed10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ed20 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
1ed30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1ed40 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1ed50 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
1ed60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
1ed70 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
1ed80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1ed90 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1eda0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
1edb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1edc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1edd0 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
1ede0 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
1edf0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
1ee00 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
1ee10 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
1ee20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
1ee30 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
1ee40 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1ee50 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
1ee60 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
1ee70 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
1ee80 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
1ee90 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
1eea0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
1eeb0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
1eec0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
1eed0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1eee0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
1eef0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76  64 offset = pSav
1ef00 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
1ef10 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
1ef20 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
1ef30 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1ef40 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1ef50 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
1ef60 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
1ef70 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
1ef80 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
1ef90 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
1efa0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
1efb0 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
1efc0 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
1efd0 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
1efe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
1eff0 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67  fset==ii*(4+pPag
1f000 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
1f010 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1f020 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1f030 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
1f040 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
1f050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1f060 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1f070 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
1f080 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
1f090 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
1f0a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f0b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
1f0c0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1f0d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f0e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
1f0f0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
1f100 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
1f110 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
1f120 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
1f130 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
1f140 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
1f150 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
1f160 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
1f170 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
1f180 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
1f190 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
1f1a0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
1f1b0 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
1f1c0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1f1d0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
1f1e0 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
1f1f0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
1f200 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
1f210 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
1f220 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
1f230 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1f240 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
1f250 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
1f260 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
1f270 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
1f280 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
1f290 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
1f2a0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
1f2b0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
1f2c0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
1f2d0 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
1f2e0 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
1f2f0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
1f300 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
1f310 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
1f320 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1f330 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
1f340 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
1f350 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
1f360 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
1f370 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
1f380 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
1f390 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
1f3a0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1f3c0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
1f3d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1f3e0 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
1f3f0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
1f400 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
1f410 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
1f420 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
1f430 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1f440 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
1f450 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
1f460 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
1f470 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
1f480 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
1f490 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
1f4a0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
1f4c0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
1f4d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1f4e0 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
1f4f0 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
1f500 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1f510 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
1f520 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
1f530 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
1f540 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
1f550 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
1f560 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
1f570 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
1f580 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
1f590 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
1f5a0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
1f5b0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1f5d0 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
1f5e0 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
1f5f0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
1f600 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1f610 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
1f620 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
1f630 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
1f640 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
1f650 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
1f660 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1f670 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
1f680 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
1f690 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
1f6a0 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
1f6b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
1f6c0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
1f6d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
1f6e0 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
1f6f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
1f700 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
1f710 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
1f720 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
1f730 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
1f740 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
1f750 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1f760 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
1f770 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1f780 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
1f790 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
1f7a0 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
1f7b0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
1f7c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
1f7d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1f7e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1f7f0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
1f800 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
1f810 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
1f820 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
1f830 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
1f840 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
1f850 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
1f860 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
1f870 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1f880 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
1f890 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
1f8a0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
1f8b0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
1f8c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
1f8d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1f8e0 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
1f8f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1f900 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
1f910 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f920 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
1f930 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
1f940 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
1f950 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
1f960 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
1f970 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
1f980 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
1f990 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
1f9a0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
1f9b0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
1f9c0 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
1f9d0 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
1f9e0 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
1f9f0 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
1fa00 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
1fa10 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1fa20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1fa30 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
1fa40 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1fa50 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
1fa60 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1fa70 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1fa80 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1fa90 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
1faa0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
1fab0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1fac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1fad0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1fae0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1faf0 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
1fb00 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1fb10 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
1fb20 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
1fb30 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
1fb40 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
1fb50 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
1fb60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1fb70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1fb80 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
1fb90 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
1fba0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
1fbb0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
1fbc0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1fbd0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
1fbe0 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
1fbf0 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
1fc00 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1fc10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1fc20 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
1fc30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1fc40 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
1fc50 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1fc60 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
1fc70 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
1fc80 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
1fc90 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
1fca0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1fcb0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
1fcc0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
1fcd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1fce0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
1fcf0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
1fd00 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
1fd10 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
1fd20 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
1fd30 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
1fd40 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
1fd50 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
1fd60 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
1fd70 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
1fd80 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
1fd90 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
1fda0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
1fdb0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
1fdc0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
1fdd0 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
1fde0 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
1fdf0 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
1fe00 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
1fe10 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
1fe20 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
1fe30 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
1fe40 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
1fe50 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
1fe60 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
1fe70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
1fe80 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
1fe90 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
1fec0 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
1fed0 2d 2d 2d 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 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
1ff10 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
1ff20 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
1ff30 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
1ff40 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
1ff50 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
1ff60 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
1ff70 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
1ff80 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
1ff90 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
1ffa0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
1ffb0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
1ffc0 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
1ffd0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
1ffe0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
1fff0 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
20000 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
20010 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
20020 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
20030 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
20040 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
20050 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
20060 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
20070 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
20080 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
20090 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
200a0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
200b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
200c0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
200d0 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
200e0 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
200f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
20100 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
20110 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
20120 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
20130 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
20140 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
20150 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
20160 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20  andler */.){  . 
20170 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
20180 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
20190 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
201a0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
201b0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
201c0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  g;.}../*.** Chan
201d0 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
201e0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
201f0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
20200 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
20210 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
20220 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
20230 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
20240 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
20250 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
20260 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
20270 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
20280 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
20290 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
202a0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
202b0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
202c0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
202d0 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
202e0 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  T or SQLITE_FULL
202f0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
20300 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
20310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
20320 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
20330 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
20340 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
20350 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
20360 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
20370 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
20380 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
20390 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
203a0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
203b0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
203c0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
203d0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
203e0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
203f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20400 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
20410 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
20420 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
20430 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
20440 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
20450 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
20460 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
20470 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
20480 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
20490 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
204a0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
204b0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
204c0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
204d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
204e0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
204f0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
20500 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
20510 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
20520 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
20530 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
20540 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
20550 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
20560 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
20570 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
20580 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
20590 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
205a0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
205b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
205c0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
205d0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
205e0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
205f0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
20600 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
20610 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
20620 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
20630 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
20640 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
20650 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
20660 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
20670 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
20680 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
20690 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
206a0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
206b0 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
206c0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
206d0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
206e0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
206f0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
20700 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
20710 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c   u16 *pPageSize,
20720 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
20730 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
20740 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
20750 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
20760 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c  ible to do a ful
20770 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  l assert_pager_s
20780 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20  tate() here, as 
20790 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
207a0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
207b0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67   from within Pag
207c0 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65  erOpen(), before
207d0 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
207e0 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
207f0 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  ect is internall
20800 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  y consistent..  
20810 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  */.  assert( rc=
20820 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
20830 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
20840 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  GER_ERROR );..  
20850 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20860 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
20870 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
20880 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
20890 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
208a0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
208b0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
208c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
208d0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
208e0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
208f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
20900 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
20910 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
20920 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
20930 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
20940 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
20950 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
20960 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
20970 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 20      char *pNew; 
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
209a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 6e  e */.      i64 n
209b0 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Byte = 0;.      
209c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
209d0 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
209e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
209f0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fd) ){.        r
20a00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
20a10 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
20a20 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
20a30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20a40 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
20a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20a60 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
20a70 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
20a80 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
20a90 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
20aa0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20ab0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
20ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
20ad0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
20ae0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
20af0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 42 79  er->dbSize = nBy
20b00 74 65 2f 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  te/pageSize;.   
20b10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
20b20 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
20b30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20b40 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
20b50 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
20b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
20b70 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
20b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20b90 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
20ba0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
20bb0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
20bc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
20bd0 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  pPageSize = (u16
20be0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
20bf0 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  e;.    if( nRese
20c00 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
20c10 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
20c20 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
20c30 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
20c40 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
20c50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
20c60 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
20c70 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
20c80 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
20c90 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
20ca0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
20cb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20cc0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
20cd0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
20ce0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
20cf0 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
20d00 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
20d10 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
20d20 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
20d30 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
20d40 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
20d50 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
20d60 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
20d70 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
20d80 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
20d90 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
20da0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
20db0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
20dc0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
20dd0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
20de0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
20df0 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
20e00 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
20e10 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
20e20 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
20e30 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
20e40 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
20e50 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
20e60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
20e70 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
20e80 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
20e90 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
20ea0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
20eb0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
20ec0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
20ed0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
20ee0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
20ef0 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
20f00 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
20f10 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
20f20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20f30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
20f40 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
20f50 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
20f60 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
20f70 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
20f80 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
20f90 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
20fa0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
20fb0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
20fc0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
20fd0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
20fe0 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ge;.  }.  if( pP
20ff0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
21000 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67  GER_OPEN && pPag
21010 65 72 2d 3e 6d 78 50 67 6e 6f 3c 70 50 61 67 65  er->mxPgno<pPage
21020 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
21030 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
21040 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
21050 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
21060 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
21070 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
21080 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
21090 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
210a0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
210b0 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
210c0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
210d0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
210e0 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
210f0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
21100 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
21110 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
21120 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
21130 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
21140 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
21150 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
21160 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
21170 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
21180 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
21190 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
211a0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
211b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
211c0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
211d0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
211e0 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
211f0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
21200 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
21210 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
21220 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
21230 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
21240 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
21250 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
21260 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
21270 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
21280 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
21290 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
212a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
212b0 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
212c0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
212d0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
212e0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
212f0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
21300 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
21310 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
21320 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
21330 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
21340 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
21350 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
21360 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
21370 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
21380 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
21390 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
213a0 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
213b0 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
213c0 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
213d0 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
213e0 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
213f0 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
21400 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
21410 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
21420 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
21430 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
21440 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
21450 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
21460 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
21470 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
21480 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
21490 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
214a0 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
214b0 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
214c0 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
214d0 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
214e0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
214f0 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
21500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
21510 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
21520 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
21530 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
21540 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
21550 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
21560 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
21570 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
21580 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
21590 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
215a0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
215b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
215c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
215d0 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
215e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
215f0 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
21600 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
21610 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
21620 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
21630 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
21640 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
21650 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
21660 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
21670 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
21680 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
21690 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
216a0 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
216b0 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
216c0 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
216d0 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
216e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
216f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21700 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
21710 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
21720 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
21730 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
21740 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
21750 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
21760 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
21770 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
21780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21790 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
217a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
217b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
217c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
217d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
217e0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
217f0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
21800 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
21810 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
21820 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
21830 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
21840 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
21850 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
21860 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
21870 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
21880 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
21890 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
218a0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
218b0 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
218c0 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
218d0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
218e0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
218f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21900 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
21910 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21920 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
21930 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
21940 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
21950 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
21960 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
21970 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
21980 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 72 65  er->dbSize;.  re
21990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
219a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
219b0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
219c0 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
219d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
219e0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
219f0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
21a00 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
21a10 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
21a20 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
21a30 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
21a40 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
21a50 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
21a60 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
21a70 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
21a80 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
21a90 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
21aa0 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
21ab0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
21ac0 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
21ad0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
21ae0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
21af0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
21b00 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
21b10 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
21b20 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
21b30 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
21b40 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
21b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
21b60 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
21b70 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
21b80 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
21b90 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
21ba0 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
21bb0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
21bc0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
21bd0 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
21be0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
21bf0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
21c00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21c10 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
21c20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21c30 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
21c40 69 6e 74 20 72 63 3b 20 20 20 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 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
21c70 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
21c80 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
21c90 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
21ca0 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
21cb0 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
21cc0 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
21cd0 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
21ce0 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
21cf0 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
21d00 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
21d10 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
21d20 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
21d30 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
21d40 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
21d50 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
21d60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21d70 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
21d80 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
21d90 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
21da0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
21db0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
21dc0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
21dd0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
21de0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
21df0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
21e00 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
21e10 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
21e20 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
21e30 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
21e40 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
21e50 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
21e60 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
21e70 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
21e80 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
21e90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21ea0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
21eb0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
21ec0 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
21ed0 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
21ee0 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
21ef0 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
21f00 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
21f10 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
21f20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
21f30 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
21f40 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
21f50 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
21f60 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
21f70 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
21f80 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
21f90 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
21fa0 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
21fb0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
21fc0 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
21fd0 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
21fe0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
21ff0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
22000 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
22010 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
22020 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
22030 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
22040 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
22050 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
22060 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
22070 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
22080 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
22090 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
220a0 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
220b0 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
220c0 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
220d0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
220e0 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
220f0 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
22100 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
22110 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
22120 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
22130 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
22140 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22150 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
22160 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
22170 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
22180 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
22190 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
221a0 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c  t behaviour woul
221b0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
221c0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
221d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
221e0 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
221f0 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
22200 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
22210 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
22220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
22230 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
22240 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
22250 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
22260 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
22270 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
22280 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
22290 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
222a0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
222b0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
222c0 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
222d0 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
222e0 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
222f0 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
22300 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
22310 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
22320 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
22330 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
22340 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
22350 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
22360 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
22370 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
22380 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
22390 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
223a0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
223b0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
223c0 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
223d0 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
223e0 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
223f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
22400 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
22410 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
22420 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
22430 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
22440 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
22450 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
22460 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
22470 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
22480 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
22490 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
224a0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
224b0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
224c0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
224d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
224e0 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
224f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
22500 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
22510 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
22520 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
22530 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
22540 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
22550 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
22560 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
22570 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
22580 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
22590 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
225a0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
225b0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
225c0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
225d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
225e0 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
225f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
22600 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
22610 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
22620 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
22630 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
22640 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65    assertTruncate
22650 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
22660 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  r);.}.../*.** Th
22670 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22680 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
22690 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
226a0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
226b0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
226c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
226d0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
226e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
226f0 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
22700 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
22710 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
22720 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
22730 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
22740 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
22750 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
22760 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
22770 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
22780 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
22790 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
227a0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
227b0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
227c0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
227d0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
227e0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
227f0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
22800 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
22810 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
22820 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
22830 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
22840 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
22850 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
22860 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
22870 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
22880 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
22890 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
228a0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
228b0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
228c0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
228d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
228e0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
228f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
22900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22910 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
22920 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
22930 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
22940 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
22950 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22960 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
22970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22990 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
229a0 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
229b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
229c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
229d0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
229e0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
229f0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
22a00 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
22a10 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
22a20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
22a30 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
22a40 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
22a50 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
22a60 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
22a70 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
22a80 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
22a90 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
22aa0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
22ab0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
22ac0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
22ad0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
22ae0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
22af0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
22b00 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
22b10 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
22b20 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
22b30 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
22b40 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
22b50 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
22b60 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
22b70 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
22b80 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
22b90 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
22ba0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
22bb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
22bc0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
22bd0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
22be0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
22bf0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
22c00 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
22c10 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
22c20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
22c30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
22c40 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
22c50 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
22c60 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
22c70 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64 69  pTmpSpace;..  di
22c80 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
22c90 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
22ca0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
22cb0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20  nMalloc();.  /* 
22cc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
22cd0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
22ce0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
22cf0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
22d00 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
22d10 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
22d20 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20  Pager->pWal,.   
22d30 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
22d40 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73   ? 0 : pPager->s
22d50 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20  ync_flags), .   
22d60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22d70 65 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70  e, pTmp.  );.  p
22d80 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
22d90 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
22da0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
22db0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
22dc0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
22dd0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
22de0 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
22df0 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
22e00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
22e10 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
22e20 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
22e30 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
22e40 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
22e50 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
22e60 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
22e70 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
22e80 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
22e90 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
22ea0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
22eb0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
22ec0 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
22ed0 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
22ee0 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
22ef0 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
22f00 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
22f10 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
22f20 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
22f30 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
22f40 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
22f50 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
22f60 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
22f70 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
22f80 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
22f90 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
22fa0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
22fb0 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
22fc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22fd0 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
22fe0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
22ff0 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
23000 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
23010 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
23020 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
23030 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
23040 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
23050 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
23060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
23070 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23080 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
23090 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
230a0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
230b0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
230c0 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
230d0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
230e0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
230f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
23100 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
23110 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
23120 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
23130 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
23140 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
23150 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
23160 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
23170 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
23180 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
23190 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
231a0 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
231b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
231c0 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
231d0 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
231e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
231f0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
23200 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
23210 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
23220 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
23230 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
23240 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
23250 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
23260 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
23270 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
23280 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
23290 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
232a0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
232b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
232c0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
232d0 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
232e0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
232f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23300 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
23310 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
23320 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
23330 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
23340 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
23350 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
23360 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
23370 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
23380 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
23390 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
233a0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
233b0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
233c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
233d0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
233e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
233f0 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
23400 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
23410 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
23420 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
23430 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
23440 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
23450 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
23460 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
23470 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
23480 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
23490 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
234a0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
234b0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
234c0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
234d0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
234e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
234f0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
23500 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
23510 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
23520 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
23530 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
23540 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
23550 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
23560 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
23570 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
23580 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
23590 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
235a0 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
235b0 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
235c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
235d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
235e0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
235f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
23600 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
23610 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
23620 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
23630 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
23640 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
23650 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
23660 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
23670 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
23680 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
23690 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
236a0 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
236b0 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
236c0 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
236d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
236e0 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
236f0 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
23700 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
23710 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
23720 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
23730 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
23740 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
23750 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
23760 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
23770 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
23780 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
23790 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
237a0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
237b0 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
237c0 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
237d0 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
237e0 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
237f0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
23800 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
23810 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
23820 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
23830 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
23840 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
23850 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
23860 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
23870 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
23880 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
23890 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
238a0 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
238b0 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
238c0 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
238d0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
238e0 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
238f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
23900 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
23910 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
23920 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
23930 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
23940 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
23950 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
23960 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
23970 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
23980 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
23990 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
239a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
239b0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
239c0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
239d0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
239e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
239f0 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
23a00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23a30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
23a40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
23a50 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
23a60 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
23a70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
23a80 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
23a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
23aa0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
23ab0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
23ac0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
23ad0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
23ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23af0 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
23b00 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
23b10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
23b20 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
23b30 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
23b40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23b50 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
23b60 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
23b70 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
23b80 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
23b90 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
23ba0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
23bb0 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
23bc0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
23bd0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
23be0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
23bf0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
23c00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
23c10 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
23c20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
23c30 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
23c40 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
23c50 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
23c60 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
23c70 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
23c80 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
23c90 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
23ca0 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
23cb0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
23cc0 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
23cd0 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
23ce0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
23cf0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
23d00 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
23d10 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
23d20 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
23d30 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
23d40 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
23d50 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
23d60 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
23d70 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
23d80 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
23d90 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
23da0 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
23db0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
23dc0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
23dd0 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
23de0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
23df0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
23e00 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
23e10 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
23e20 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
23e30 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
23e40 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
23e50 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
23e60 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
23e70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
23e80 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
23e90 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
23ea0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
23eb0 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
23ec0 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
23ed0 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
23ee0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
23ef0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
23f00 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
23f10 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
23f20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
23f30 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
23f40 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
23f50 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
23f60 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
23f70 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
23f80 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
23f90 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
23fa0 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
23fb0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
23fc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
23fd0 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
23fe0 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
23ff0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
24000 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
24010 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
24020 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
24030 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
24040 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
24050 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
24060 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
24070 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
24080 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
24090 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
240a0 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
240b0 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
240c0 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
240d0 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
240e0 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
240f0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
24100 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
24110 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
24120 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
24130 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
24140 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
24150 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
24160 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
24170 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
24180 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
24190 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
241a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
241b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
241c0 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
241d0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
241e0 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
241f0 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
24200 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
24210 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
24220 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
24230 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
24240 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
24250 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
24260 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
24270 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
24280 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
24290 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
242a0 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
242b0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
242c0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
242d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
242e0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
242f0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
24300 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
24310 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
24320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24330 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
24340 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
24350 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
24360 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
24370 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
24380 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
24390 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
243a0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
243b0 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
243c0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
243d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
243e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
243f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
24400 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
24410 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
24420 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
24430 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
24440 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
24450 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
24460 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
24470 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
24480 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
24490 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
244a0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
244b0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
244c0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
244d0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
244e0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
244f0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
24500 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
24510 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
24520 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
24530 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
24540 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
24550 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
24560 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
24570 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
24580 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
24590 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
245a0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
245b0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
245c0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
245d0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
245e0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
245f0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
24600 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
24610 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
24620 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
24630 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
24640 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
24650 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
24660 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
24670 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
24680 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
24690 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
246a0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
246b0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
246c0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
246d0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
246e0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
246f0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
24700 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
24710 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
24720 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
24730 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
24740 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
24750 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
24760 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
24770 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
24780 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
24790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
247a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
247b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
247c0 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
247d0 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
247e0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
247f0 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
24800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
24810 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
24820 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
24830 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
24840 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
24850 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
24860 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
24870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24880 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24890 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
248a0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
248b0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
248c0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
248d0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
248e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
248f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
24900 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
24910 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
24920 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
24930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24940 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
24950 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
24960 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  flags| .        
24970 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f    (pPager->sync_
24980 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  flags==SQLITE_SY
24990 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
249a0 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
249b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
249c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
249d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
249e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
249f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
24a00 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
24a10 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
24a20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d  if( newHdr && 0=
24a30 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
24a40 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
24a50 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
24a60 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
24a70 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
24a80 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
24a90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
24aa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
24ab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
24ac0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
24ad0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
24ae0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
24af0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
24b00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65  }.  }..  /* Unle
24b10 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
24b20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20  in noSync mode, 
24b30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
24b40 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20   was just .  ** 
24b50 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
24b60 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ced. Either way,
24b70 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
24b80 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
24b90 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67  on .  ** all pag
24ba0 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
24bb0 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
24bc0 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
24bd0 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65  PCache);.  pPage
24be0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
24bf0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a  R_WRITER_DBMOD;.
24c00 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
24c10 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
24c20 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
24c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
24c40 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
24c50 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
24c60 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
24c70 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
24c80 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
24c90 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
24ca0 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
24cb0 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
24cc0 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
24cd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
24ce0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
24cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24d00 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
24d10 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
24d20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
24d30 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
24d40 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
24d50 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
24d60 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
24d70 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
24d80 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
24d90 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
24da0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
24db0 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
24dc0 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
24dd0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
24de0 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
24df0 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
24e00 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
24e10 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
24e20 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
24e30 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
24e40 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
24e50 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
24e60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
24e70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
24e80 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
24e90 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
24ea0 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
24eb0 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
24ec0 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
24ed0 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
24ee0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
24ef0 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
24f00 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
24f10 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
24f20 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
24f30 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
24f40 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
24f50 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
24f60 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
24f70 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
24f80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
24f90 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
24fa0 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
24fb0 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
24fc0 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
24fd0 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
24fe0 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
24ff0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
25000 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
25010 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
25020 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
25030 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
25040 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
25050 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
25060 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
25070 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
25080 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
25090 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
250a0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
250b0 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
250c0 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
250d0 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
250e0 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
250f0 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
25100 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
25110 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
25120 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
25130 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
25140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25150 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
25160 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
25170 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
25180 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
25190 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
251a0 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
251b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
251c0 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
251d0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
251e0 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
251f0 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
25200 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
25210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
25220 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
25230 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ist(Pager *pPage
25240 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29  r, PgHdr *pList)
25250 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  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 2f 2a 20 52 65 74 75           /* Retu
25280 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
25290 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
252a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
252b0 65 64 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  ed in WRITER_DBM
252c0 4f 44 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  OD state..  **. 
252d0 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 6d   ** However it m
252e0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ay be called in 
252f0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
25300 73 74 61 74 65 20 69 66 20 74 68 65 20 70 61 67  state if the pag
25310 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 77 72 69  e being.  ** wri
25320 74 74 65 6e 20 28 61 6e 64 20 61 6c 6c 20 6f 74  tten (and all ot
25330 68 65 72 20 70 61 67 65 73 20 74 68 61 74 20 72  her pages that r
25340 65 73 69 64 65 20 6f 6e 20 74 68 65 20 73 61 6d  eside on the sam
25350 65 20 64 69 73 6b 20 73 65 63 74 6f 72 29 20 77  e disk sector) w
25360 61 73 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  as.  ** a free-l
25370 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74  ist leaf page at
25380 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
25390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  e transaction. I
253a0 6e 20 74 68 61 74 20 63 61 73 65 0a 20 20 2a 2a  n that case.  **
253b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
253c0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
253d0 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2c   being modified,
253e0 20 73 6f 20 69 74 20 69 73 20 4f 6b 20 74 6f 20   so it is Ok to 
253f0 77 72 69 74 65 0a 20 20 2a 2a 20 74 6f 20 69 74  write.  ** to it
25400 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
25410 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
25420 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
25430 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
25440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25450 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
25460 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
25470 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
25480 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
25490 41 43 48 45 4d 4f 44 20 0a 20 20 29 3b 0a 20 20  ACHEMOD .  );.  
254a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
254b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
254c0 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20  ITER_DBMOD .    
254d0 20 20 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 70 44     || (pList->pD
254e0 69 72 74 79 3d 3d 30 20 26 26 20 70 4c 69 73 74  irty==0 && pList
254f0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
25500 64 62 46 69 6c 65 53 69 7a 65 29 0a 20 20 29 3b  dbFileSize).  );
25510 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
25520 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
25530 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
25540 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
25550 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
25560 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
25570 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
25580 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
25590 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
255a0 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20  owing.  ** call 
255b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
255c0 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
255d0 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
255e0 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
255f0 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
25600 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
25610 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
25620 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
25630 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
25640 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
25650 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
25660 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
25670 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
25680 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
25690 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
256a0 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
256b0 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
256c0 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
256d0 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
256e0 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
256f0 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
25700 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
25710 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
25720 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
25730 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
25740 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
25750 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
25760 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
25770 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
25780 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
25790 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
257a0 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
257b0 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
257c0 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
257d0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
257e0 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
257f0 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
25800 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
25810 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
25820 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
25830 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
25840 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
25850 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
25860 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
25870 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
25880 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
25890 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
258a0 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  K);..  /* If the
258b0 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
258c0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
258d0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
258e0 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
258f0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
25900 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
25910 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
25920 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
25930 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
25940 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
25950 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
25960 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
25970 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
25980 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25990 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
259a0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
259b0 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
259c0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
259d0 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
259e0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
259f0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
25a00 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
25a10 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
25a20 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
25a30 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
25a40 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
25a50 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
25a60 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
25a70 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
25a80 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
25a90 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
25aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25ab0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
25ac0 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ze>pPager->dbOri
25ad0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  gSize ){.    sql
25ae0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
25af0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
25b00 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
25b10 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
25b20 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
25b30 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
25b40 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
25b50 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
25b60 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 7d  T, &szFile);.  }
25b70 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
25b80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
25b90 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
25ba0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
25bb0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
25bc0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
25bd0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
25be0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
25bf0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
25c00 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
25c10 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
25c20 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
25c30 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
25c40 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
25c50 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
25c60 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
25c70 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
25c80 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
25c90 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
25ca0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
25cb0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
25cc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
25cd0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
25ce0 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
25cf0 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
25d00 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
25d10 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
25d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
25d30 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
25d40 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
25d50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
25d60 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
25d70 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
25d80 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
25d90 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
25da0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
25db0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
25dc0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
25dd0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
25de0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
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 2f 2a 20 44 61 74 61 20          /* Data 
25e10 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
25e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
25e30 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
25e40 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
25e50 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e   );..      /* En
25e60 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
25e70 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
25e80 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
25e90 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
25ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
25eb0 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
25ec0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
25ed0 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
25ee0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
25ef0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
25f00 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
25f10 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
25f20 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
25f30 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
25f40 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
25f50 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
25f60 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
25f70 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
25f80 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
25f90 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25fa0 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
25fb0 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
25fc0 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
25fd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
25fe0 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
25ff0 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
26000 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
26010 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
26020 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
26030 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
26040 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
26050 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
26060 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
26070 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
26080 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
26090 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
260a0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
260b0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a   pgno;.      }..
260c0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
260d0 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
260e0 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
260f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
26100 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
26110 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
26120 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
26130 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
26140 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
26150 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
26160 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
26170 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
26180 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26190 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
261a0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
261b0 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
261c0 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
261d0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
261e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
261f0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
26200 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
26210 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
26220 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
26230 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
26240 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rite);.    }else
26250 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
26260 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
26270 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
26280 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
26290 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  o));.    }.#ifde
262a0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
262b0 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
262c0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
262d0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
262e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
262f0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
26300 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
26310 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
26320 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
26330 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
26340 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
26350 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
26360 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
26370 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
26380 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
26390 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
263a0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
263b0 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
263c0 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
263d0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
263e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
263f0 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
26400 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
26410 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
26420 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
26430 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
26440 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
26450 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
26460 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
26470 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
26480 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26490 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
264a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
264b0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
264c0 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
264d0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
264e0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
264f0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
26500 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26510 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
26520 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
26530 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
26540 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
26550 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26560 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
26570 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
26580 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
26590 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
265a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
265b0 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
265c0 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
265d0 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
265e0 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
265f0 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
26600 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
26610 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
26620 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
26630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
26640 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
26650 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
26660 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
26670 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
26680 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
26690 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
266a0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
266b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
266c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
266d0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
266e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
266f0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
26700 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
26710 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
26720 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
26730 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
26740 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
26750 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
26760 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
26770 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
26780 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
26790 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
267a0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
267b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
267c0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
267d0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
267e0 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
267f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
26800 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
26810 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
26820 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
26830 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
26840 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
26850 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
26860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26870 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
26880 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
26890 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
268a0 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
268b0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
268c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
268d0 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
268e0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
268f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26900 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
26910 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
26920 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
26930 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
26940 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
26950 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
26960 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
26970 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
26980 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
26990 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
269a0 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
269b0 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
269c0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
269d0 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
269e0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
269f0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
26a00 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
26a10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26a20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
26a30 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
26a40 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
26a50 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
26a60 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
26a70 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
26a80 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20  *pData2;.  .    
26a90 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
26aa0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
26ab0 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
26ac0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
26ad0 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  2);.      PAGERT
26ae0 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
26af0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
26b00 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26b10 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
26b20 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
26b30 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
26b40 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
26b50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
26b60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26b70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
26b80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
26b90 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
26ba0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
26bb0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
26bc0 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
26bd0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
26be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26bf0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
26c00 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
26c10 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
26c20 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
26c30 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
26c40 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
26c50 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
26c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26c70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26c80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
26c90 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
26ca0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
26cb0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
26cc0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
26cd0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
26ce0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
26cf0 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
26d00 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
26d10 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
26d20 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
26d30 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
26d40 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
26d50 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
26d60 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
26d70 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
26d80 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
26d90 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
26da0 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
26db0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
26dc0 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
26dd0 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
26de0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
26df0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
26e00 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
26e10 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
26e20 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
26e30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
26e40 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
26e50 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
26e60 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
26e70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
26e80 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
26e90 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
26ea0 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
26eb0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
26ec0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
26ed0 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
26ee0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
26ef0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
26f00 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
26f10 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
26f20 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
26f30 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
26f40 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
26f50 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
26f60 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
26f70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
26f80 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
26f90 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
26fa0 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
26fb0 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
26fc0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
26fd0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
26fe0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
26ff0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
27000 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
27010 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
27020 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
27030 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
27040 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
27050 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
27060 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
27070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
27080 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
27090 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
270a0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
270b0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
270c0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
270d0 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69  SyncSpill flag i
270e0 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d  s set during tim
270f0 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  es when doing a 
27100 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75  sync of.  ** jou
27110 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67  rnal (and adding
27120 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69   a new header) i
27130 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20  s not allowed.  
27140 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a  This occurs.  **
27150 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f   during calls to
27160 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27170 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e  te() while tryin
27180 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c  g to journal mul
27190 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73  tiple.  ** pages
271a0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
271b0 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20  e same sector.. 
271c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e   **.  ** The doN
271d0 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68  otSpill flag inh
271e0 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
271f0 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c  spilling regardl
27200 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20  ess of whether. 
27210 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e   ** or not a syn
27220 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  c is required.  
27230 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69  This is set duri
27240 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ng a rollback.. 
27250 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
27260 67 20 69 73 20 61 6c 73 6f 20 69 6e 68 69 62 69  g is also inhibi
27270 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
27280 72 72 6f 72 20 73 74 61 74 65 2e 0a 20 20 2a 2f  rror state..  */
27290 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
272a0 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
272b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
272c0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
272d0 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ill ) return SQL
272e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
272f0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
27300 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c  pill && (pPg->fl
27310 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
27320 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20  _SYNC)!=0 ){.   
27330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27340 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70  K;.  }..  pPg->p
27350 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
27360 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
27370 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
27380 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
27390 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
273a0 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
273b0 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
273c0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
273d0 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  { .      rc = su
273e0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
273f0 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ); .    }.    if
27400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27410 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
27420 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
27430 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20  ger, pPg, 0, 0, 
27440 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
27450 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e  e{.  .    /* Syn
27460 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
27470 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
27480 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  */.    if( pPg->
27490 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
274a0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 72  _SYNC ){.      r
274b0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
274c0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
274d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
274e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
274f0 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c  f this page is l
27500 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63  arger than the c
27510 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20  urrent size of. 
27520 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
27530 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
27540 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
27550 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
27560 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54  ournal..    ** T
27570 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
27580 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
27590 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
275a0 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
275b0 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  .    ** actually
275c0 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
275d0 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  he file in this 
275e0 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  case..    **.   
275f0 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   ** Consider the
27600 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65   following seque
27610 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20  nce of events:. 
27620 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42     **.    **   B
27630 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20  EGIN;.    **    
27640 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
27650 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f  >.    **     <mo
27660 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20  dify page X>.   
27670 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
27680 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20  T sp;.    **    
27690 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62     <shrink datab
276a0 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61  ase file to Y pa
276b0 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  ges>.    **     
276c0 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61    pagerStress(pa
276d0 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20  ge X).    **    
276e0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
276f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27700 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68  f (X>Y), then wh
27710 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69  en pagerStress i
27720 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20  s called page X 
27730 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
27740 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  ten.    ** out t
27750 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27760 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65  ile, but will be
27770 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68   dropped from th
27780 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20  e cache. Then,. 
27790 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
277a0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
277b0 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
277c0 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
277d0 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20  ill read.    ** 
277e0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
277f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
27800 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
27810 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
27820 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68  it.    ** was wh
27830 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
27840 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20  on started, not 
27850 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22  as it was when "
27860 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20  SAVEPOINT sp".  
27870 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65    ** was execute
27880 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
27890 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
278a0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
278b0 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
278c0 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
278d0 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e      ** sub-journ
278e0 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20  al file now (if 
278f0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
27900 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61  y there), so tha
27910 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  t it will.    **
27920 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
27930 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
27940 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  e when the "ROLL
27950 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a  BACK TO sp" is .
27960 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e      ** executed.
27970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27980 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72  NEVER(.        r
27990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
279a0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
279b0 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a  ->dbSize && subj
279c0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
279d0 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20  ).    ) ){.     
279e0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
279f0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
27a00 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
27a10 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
27a20 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
27a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27a40 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
27a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27a60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
27a70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
27a80 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
27a90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
27aa0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
27ab0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
27ac0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
27ad0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
27ae0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
27af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27b00 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
27b10 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
27b20 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27b30 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
27b40 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
27b50 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
27b60 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
27b70 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
27b80 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
27b90 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
27ba0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
27bb0 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
27bc0 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
27bd0 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
27be0 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
27bf0 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
27c00 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
27c10 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
27c20 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
27c30 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
27c40 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
27c50 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
27c60 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
27c70 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
27c80 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
27c90 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
27ca0 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
27cb0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
27cc0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
27cd0 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
27ce0 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
27cf0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
27d00 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
27d10 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
27d20 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
27d30 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
27d40 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
27d50 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
27d60 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
27d70 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
27d80 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
27d90 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
27da0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
27db0 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
27dc0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
27dd0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
27de0 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
27df0 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
27e00 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
27e10 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
27e20 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
27e30 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
27e40 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
27e50 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
27e60 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
27e70 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
27e80 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
27e90 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
27ea0 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
27eb0 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
27ec0 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
27ed0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
27ee0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
27ef0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
27f00 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
27f10 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
27f20 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
27f30 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
27f40 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
27f50 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
27f60 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
27f70 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
27f80 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
27f90 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
27fa0 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
27fb0 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
27fc0 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
27fd0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
27fe0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
27ff0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
28000 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
28010 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
28020 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
28030 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
28040 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
28050 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
28060 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
28070 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
28080 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
28090 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
280a0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
280b0 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
280c0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
280d0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
280e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
280f0 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
28100 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
28110 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
28120 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
28130 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
28140 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
28150 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
28160 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
28170 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28180 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
28190 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
281a0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
281b0 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
281c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
281d0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
281e0 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
281f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28200 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
28210 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
28220 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
28230 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
28240 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
28250 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
28260 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
28270 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
28280 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282a0 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
282b0 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
282c0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
282d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
282e0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
282f0 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
28300 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
28310 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
28320 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
28330 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
28340 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
28350 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
28360 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
28370 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
28380 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
28390 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
283a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
283b0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
283c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
283d0 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
283e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
283f0 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
28400 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
28410 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
28420 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
28430 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
28440 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
28450 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
28460 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
28470 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28480 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
28490 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
284a0 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
284b0 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
284c0 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
284d0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
284e0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
284f0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
28500 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
28510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28520 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
28530 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
28540 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
28550 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
28560 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
28570 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
28580 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
28590 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
285a0 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
285b0 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
285c0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
285d0 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
285e0 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
285f0 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
28600 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
28610 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
28620 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
28630 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
28640 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
28650 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66  /.  u16 szPageDf
28660 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
28670 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
28680 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
28690 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
286a0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
286b0 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
286c0 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
286d0 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
286e0 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
286f0 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
28700 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
28710 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
28720 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
28730 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
28740 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
28750 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
28760 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
28770 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
28780 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
28790 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
287a0 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
287b0 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
287c0 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
287d0 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
287e0 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
287f0 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
28800 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
28810 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
28820 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
28830 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
28840 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
28850 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
28860 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
28870 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
28880 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
28890 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
288a0 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
288b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
288c0 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
288d0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
288e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
288f0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
28900 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
28910 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
28920 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
28930 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
28940 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
28950 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
28960 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
28970 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
28980 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
28990 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
289a0 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
289b0 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
289c0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
289d0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
289e0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
289f0 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
28a00 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
28a10 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
28a20 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
28a30 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
28a40 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
28a50 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
28a60 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
28a70 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
28a80 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
28a90 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
28aa0 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
28ab0 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
28ac0 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
28ad0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28ae0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
28af0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28b00 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
28b10 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
28b20 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
28b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
28b40 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
28b50 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
28b60 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
28b70 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74      {.      zPat
28b80 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
28b90 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
28ba0 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
28bb0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
28bc0 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ils */.      rc 
28bd0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
28be0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
28bf0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
28c00 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
28c10 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68      }..    nPath
28c20 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
28c30 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
28c40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
28c50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
28c60 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
28c70 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
28c80 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
28c90 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
28ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
28cb0 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
28cc0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
28cd0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
28ce0 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
28cf0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28d00 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
28d10 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
28d20 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
28d30 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
28d40 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
28d50 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
28d60 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
28d70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
28d80 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
28d90 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
28da0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
28db0 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
28dc0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
28dd0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
28de0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
28df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28e00 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
28e10 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
28e20 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
28e30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
28e40 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
28e50 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
28e60 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
28e70 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
28e80 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
28e90 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
28ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28eb0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
28ec0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
28ed0 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
28ee0 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
28ef0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
28f00 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
28f10 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
28f20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
28f30 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
28f40 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
28f50 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
28f60 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
28f70 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
28f80 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
28f90 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
28fb0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
28fc0 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
28fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
28fe0 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
28ff0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
29000 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
29010 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
29020 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
29030 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
29040 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
29050 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
29070 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
29080 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
29090 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
290a0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
290b0 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
290c0 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
290d0 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
290e0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
290f0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
29100 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
29110 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
29120 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
29130 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
29140 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
29150 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
29160 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
29170 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
29180 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
29190 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
291a0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
291b0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
291c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
291d0 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
291e0 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
291f0 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
29200 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
29210 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20  me + 8 + 1      
29220 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
29230 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
29240 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
29250 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
29260 20 34 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   4 + 1          
29270 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
29280 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
29290 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
292a0 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
292b0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
292c0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
292d0 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
292e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
292f0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
29300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29310 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
29320 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
29330 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
29340 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
29350 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
29360 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
29370 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
29380 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
29390 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
293a0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
293b0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
293c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
293d0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
293e0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
293f0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
29400 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
29410 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
29420 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
29430 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
29440 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
29450 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
29460 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
29470 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
29480 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
29490 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
294a0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
294b0 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
294c0 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
294d0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
294e0 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
294f0 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
29500 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70  athname ){.    p
29510 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
29520 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
29530 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
29540 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1);.    memcpy(p
29550 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
29560 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
29570 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
29580 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
29590 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
295a0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
295b0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
295c0 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
295d0 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
295e0 2c 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 8);.    if( pP
295f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
29600 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  0]==0 ){.      p
29610 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
29620 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69  0] = 0;.    }.#i
29630 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29640 54 5f 57 41 4c 0a 20 20 20 20 65 6c 73 65 7b 0a  T_WAL.    else{.
29650 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57        pPager->zW
29660 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
29670 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
29680 2b 38 2b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  +8+1];.      mem
29690 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
296a0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
296b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
296c0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
296d0 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  Wal[nPathname], 
296e0 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "-wal", 4);.    
296f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
29700 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
29710 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
29720 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
29730 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
29740 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
29750 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
29760 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
29770 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
29780 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
29790 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  && !memDb ){.   
297a0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
297b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297c0 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
297d0 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
297e0 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
297f0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
29800 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
29810 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
29820 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
29830 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  t);.    readOnly
29840 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
29850 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
29860 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
29870 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
29880 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
29890 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
298a0 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
298b0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
298c0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
298d0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
298e0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
298f0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
29900 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
29910 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
29920 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
29930 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
29940 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
29950 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
29960 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
29970 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
29980 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
29990 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
299a0 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
299b0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
299c0 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
299d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
299e0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
299f0 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
29a00 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
29a10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29a20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
29a30 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
29a40 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
29a50 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
29a60 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
29a70 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
29a80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
29a90 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
29aa0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
29ab0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
29ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
29ad0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
29ae0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
29af0 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
29b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29b10 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
29b20 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  16)pPager->secto
29b30 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
29b40 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
29b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
29b60 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
29b70 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
29b80 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
29b90 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
29ba0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
29bb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
29bc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29bd0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
29be0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
29bf0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
29c00 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
29c10 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
29c20 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
29c30 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
29c40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
29c50 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
29c60 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
29c70 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
29c80 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
29c90 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
29ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29cb0 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
29cc0 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
29cd0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
29ce0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
29cf0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
29d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29d10 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
29d20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
29d30 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
29d40 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
29d50 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
29d60 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
29d70 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
29d80 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
29d90 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
29da0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
29db0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
29dc0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
29dd0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
29de0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
29df0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
29e00 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
29e10 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
29e20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
29e30 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
29e40 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
29e50 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
29e60 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
29e70 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
29e80 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
29e90 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
29ea0 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
29eb0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
29ec0 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
29ed0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
29ee0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
29ef0 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
29f00 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
29f10 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
29f20 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
29f30 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
29f40 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
29f50 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
29f60 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
29f70 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
29f80 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
29f90 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
29fa0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
29fb0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
29fc0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
29fd0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
29fe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29ff0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2a000 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2a010 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2a020 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2a030 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2a040 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2a050 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2a060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2a070 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2a080 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2a090 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2a0a0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2a0b0 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2a0c0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2a0d0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2a0e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2a0f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a100 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2a110 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2a120 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2a130 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2a140 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2a150 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2a160 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2a170 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2a180 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2a190 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2a1a0 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2a1b0 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2a1c0 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2a1d0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2a1e0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2a1f0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2a200 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2a210 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2a220 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2a230 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2a240 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2a250 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2a260 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2a270 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2a280 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2a290 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2a2a0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2a2b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2a2c0 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2a2d0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2a2e0 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2a2f0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
2a300 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
2a310 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
2a320 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
2a330 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2a340 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2a350 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2a360 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2a370 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2a380 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2a390 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2a3a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2a3b0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2a3c0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2a3d0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2a3e0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2a3f0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2a400 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2a410 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2a420 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2a430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2a440 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2a450 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2a460 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2a470 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2a480 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2a490 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2a4a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2a4b0 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2a4c0 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2a4d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2a4e0 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2a4f0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2a500 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2a510 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2a520 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2a530 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2a540 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2a550 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2a560 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2a570 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2a580 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2a590 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2a5a0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2a5b0 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2a5c0 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2a5d0 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2a5e0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2a5f0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2a600 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2a610 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2a620 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2a630 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
2a640 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
2a650 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
2a660 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
2a670 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2a680 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
2a690 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2a6a0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2a6b0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2a6c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2a6d0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2a6e0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2a6f0 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2a700 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2a710 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2a720 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2a730 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2a740 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2a750 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2a760 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2a770 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2a780 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2a790 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2a7a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2a7b0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2a7c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2a7d0 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2a7e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2a7f0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2a800 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2a810 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2a820 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2a830 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2a840 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2a850 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2a860 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2a870 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2a880 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2a890 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2a8a0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2a8b0 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
2a8c0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2a8d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a8e0 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
2a8f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2a900 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2a910 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2a920 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2a930 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2a940 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2a950 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2a960 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2a970 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2a980 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2a990 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2a9a0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2a9b0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2a9c0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2a9d0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2a9e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2a9f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2aa00 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2aa10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2aa20 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2aa30 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2aa40 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2aa50 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2aa60 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2aa70 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2aa80 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2aa90 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2aaa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2aab0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2aac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2aad0 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2aae0 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2aaf0 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2ab00 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2ab10 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ab20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2ab30 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2ab40 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2ab50 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2ab60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2ab70 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2ab80 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2ab90 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2aba0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2abb0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2abc0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2abd0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2abe0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2abf0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2ac00 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2ac10 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2ac20 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2ac30 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2ac40 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2ac50 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2ac60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2ac70 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2ac80 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2ac90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2aca0 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2acb0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2acc0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2acd0 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2ace0 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2acf0 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2ad00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ad10 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2ad20 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2ad30 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2ad40 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2ad50 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2ad60 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2ad70 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2ad80 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2ad90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ada0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2adb0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2adc0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2add0 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2ade0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2adf0 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2ae00 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2ae10 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2ae20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2ae30 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2ae40 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2ae50 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2ae60 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2ae70 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2ae80 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2ae90 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2aea0 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2aeb0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2aec0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2aed0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2aee0 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2aef0 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2af00 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2af10 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2af20 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2af30 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2af40 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2af50 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2af60 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2af70 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2af80 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2af90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2afa0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2afb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2afc0 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2afd0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2afe0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2aff0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2b000 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2b010 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2b020 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2b030 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2b040 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2b050 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2b060 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2b070 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b080 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2b090 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2b0a0 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2b0b0 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2b0c0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2b0d0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2b0e0 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2b0f0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2b100 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2b110 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2b120 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2b130 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2b140 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2b150 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2b160 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2b170 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2b180 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2b190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b1a0 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2b1b0 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2b1c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b1d0 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2b1e0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2b1f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2b200 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2b210 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2b220 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2b230 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2b240 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2b250 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2b260 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2b270 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2b280 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2b290 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2b2a0 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2b2b0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2b2c0 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2b2d0 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2b2e0 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2b2f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2b300 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2b310 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2b320 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2b330 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2b340 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2b350 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2b360 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2b370 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2b380 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2b390 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2b3a0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2b3b0 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2b3c0 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2b3d0 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2b3e0 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2b3f0 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2b400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b410 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2b420 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2b430 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2b440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b450 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2b460 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b480 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2b490 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2b4a0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
2b4b0 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
2b4c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2b4d0 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
2b4e0 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
2b4f0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
2b500 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2b510 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
2b520 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
2b530 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
2b540 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
2b550 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
2b560 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
2b570 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
2b580 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
2b590 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
2b5a0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
2b5b0 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
2b5c0 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
2b5d0 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
2b5e0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2b5f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2b600 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2b610 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b630 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
2b640 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b650 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2b660 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2b670 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2b680 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2b690 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2b6a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2b6b0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2b6c0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2b6d0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2b6e0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 55            pagerU
2b6f0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2b700 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2b710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b720 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2b730 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2b740 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b750 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2b760 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2b770 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2b780 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2b790 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2b7a0 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2b7b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2b7c0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2b7d0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2b7e0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2b7f0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2b800 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2b810 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2b820 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2b830 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2b840 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2b850 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2b860 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2b870 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2b880 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2b890 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2b8a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2b8b0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2b8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2b8d0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2b8e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2b8f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2b900 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2b910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b920 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2b930 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2b940 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2b950 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b960 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2b970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b980 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2b990 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2b9a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b9b0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2b9c0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2b9d0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2b9e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b9f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2ba00 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2ba10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ba20 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2ba30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ba40 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2ba50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ba60 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2ba70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2ba80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ba90 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2baa0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2bab0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2bac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2bad0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2bae0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2baf0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2bb00 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2bb10 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2bb20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2bb30 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2bb40 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2bb50 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2bb60 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2bb70 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2bb80 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2bb90 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2bba0 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2bbb0 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2bbc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2bbd0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2bbe0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2bbf0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2bc00 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2bc10 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2bc20 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2bc30 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2bc40 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2bc60 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2bc70 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2bc80 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2bc90 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2bca0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2bcb0 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2bcc0 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2bcd0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2bce0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2bcf0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2bd00 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2bd10 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2bd20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2bd30 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2bd40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2bd50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2bd60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2bd70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bd80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2bd90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2bda0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2bdb0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2bdc0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2bdd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2bde0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2bdf0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2be00 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2be10 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2be20 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2be30 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2be40 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2be50 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2be60 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2be70 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2be80 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2be90 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2bea0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2beb0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2bec0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2bed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2bee0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2bef0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2bf00 6c 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  ly in PAGER_UNLO
2bf10 43 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63  CK state (no loc
2bf20 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f  k held.**      o
2bf30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2bf40 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74  ile), then an at
2bf50 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2bf60 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20   obtain a.**    
2bf70 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e    SHARED lock on
2bf80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bf90 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  le. Immediately 
2bfa0 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a  after obtaining.
2bfb0 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52  **      the SHAR
2bfc0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c  ED lock, the fil
2bfd0 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63  e-system is chec
2bfe0 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ked for a hot-jo
2bff0 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77  urnal,.**      w
2c000 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62  hich is played b
2c010 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20  ack if present. 
2c020 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f  Following any ho
2c030 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  t-journal .**   
2c040 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65     rollback, the
2c050 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2c060 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64   cache are valid
2c070 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67  ated by checking
2c080 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68  .**      the 'ch
2c090 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69  ange-counter' fi
2c0a0 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
2c0b0 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20  ase file header 
2c0c0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63  and.**      disc
2c0d0 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72  arded if they ar
2c0e0 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e  e found to be in
2c0f0 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  valid..**.**   2
2c100 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
2c110 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
2c120 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64  lusive-mode, and
2c130 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
2c140 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20  ntly.**      no 
2c150 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2c160 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61  rences to any pa
2c170 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74  ges, and is in t
2c180 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a  he error state,.
2c190 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20  **      then an 
2c1a0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2c1b0 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
2c1c0 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63  or state by disc
2c1d0 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  arding.**      t
2c1e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2c1f0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  he page cache an
2c200 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  d rolling back a
2c210 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a  ny open journal.
2c220 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a  **      file..**
2c230 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
2c240 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
2c250 79 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e  y (2) above is n
2c260 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e  ot attempted, an
2c270 64 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d if the.** page
2c280 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
2c290 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
2c2a0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68  n SQLITE_FULL wh
2c2b0 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
2c2c0 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
2c2d0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
2c2e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74   is returned. It
2c2f0 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
2c300 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74   read the.** dat
2c310 61 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51  abase when in SQ
2c320 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20  LITE_FULL error 
2c330 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  state..**.** Oth
2c340 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
2c350 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2c360 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2c370 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2c380 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63  n.** IO error oc
2c390 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69  curs while locki
2c3a0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
2c3b0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20   checking for a 
2c3c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2c3d0 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  ile or rolling b
2c3e0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
2c3f0 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
2c400 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2c410 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2c420 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
2c430 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2c440 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c450 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2c460 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2c470 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2c480 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2c490 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
2c4a0 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
2c4b0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2c4c0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
2c4d0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
2c4e0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
2c4f0 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
2c500 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
2c510 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
2c520 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
2c530 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
2c540 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
2c550 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
2c560 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
2c570 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
2c580 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2c590 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2c5a0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
2c5b0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2c5c0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2c5d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2c5e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2c5f0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
2c600 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2c610 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
2c620 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
2c630 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2c640 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
2c650 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
2c660 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
2c670 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
2c680 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2c690 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
2c6a0 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
2c6b0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
2c6c0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
2c6d0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
2c6e0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
2c6f0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2c700 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c710 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2c720 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  k==0 || pPager->
2c730 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20  readOnly );..   
2c740 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
2c750 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  eadlock==0 ){.  
2c760 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2c770 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
2c780 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2c790 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2c7a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c7b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2c7c0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
2c7d0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
2c7e0 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
2c7f0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CK );.        go
2c800 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2c810 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2c820 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
2c830 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
2c840 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
2c850 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
2c860 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2c870 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
2c880 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
2c890 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
2c8a0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
2c8b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2c8c0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
2c8d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
2c8e0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
2c8f0 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
2c900 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
2c910 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c920 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2c930 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
2c940 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
2c950 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
2c960 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
2c970 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2c980 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
2c990 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
2c9a0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
2c9b0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
2c9c0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
2c9d0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
2c9e0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2c9f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2ca00 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
2ca10 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2ca20 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
2ca30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2ca40 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
2ca50 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
2ca60 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
2ca70 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2ca80 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
2ca90 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
2caa0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
2cab0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
2cac0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
2cad0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
2cae0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
2caf0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
2cb00 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
2cb10 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
2cb20 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
2cb30 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
2cb40 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
2cb50 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
2cb60 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
2cb70 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
2cb80 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
2cb90 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
2cba0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
2cbb0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
2cbc0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
2cbd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2cbe0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2cbf0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2cc00 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
2cc10 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
2cc20 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
2cc30 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
2cc40 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
2cc50 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
2cc60 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2cc70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2cc80 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
2cc90 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
2cca0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2ccb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ccc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2ccd0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2cce0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
2ccf0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2cd00 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
2cd10 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
2cd20 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
2cd30 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2cd40 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2cd50 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
2cd60 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
2cd70 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
2cd80 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
2cd90 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
2cda0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2cdb0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
2cdc0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
2cdd0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
2cde0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
2cdf0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
2ce00 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
2ce10 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
2ce20 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
2ce30 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2ce40 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
2ce50 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
2ce60 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
2ce70 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
2ce80 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
2ce90 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
2cea0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2ceb0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2cec0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2ced0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
2cee0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
2cef0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
2cf00 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
2cf10 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
2cf20 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
2cf30 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
2cf40 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
2cf50 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
2cf60 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
2cf70 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
2cf80 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
2cf90 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
2cfa0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
2cfb0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
2cfc0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2cfd0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
2cfe0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
2cff0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
2d000 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
2d010 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2d020 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2d030 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2d040 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2d050 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
2d060 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
2d070 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d080 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
2d090 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
2d0a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2d0b0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
2d0c0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
2d0d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2d0e0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2d0f0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
2d100 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d110 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
2d120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2d130 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
2d140 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2d150 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2d160 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2d170 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2d180 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d190 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2d1a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2d1b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2d1c0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2d1d0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2d1e0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
2d1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2d200 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2d210 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2d220 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
2d230 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d240 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
2d250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2d260 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2d270 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d280 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2d290 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d2a0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2d2b0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2d2c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d2d0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2d2e0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
2d2f0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2d300 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
2d310 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
2d320 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
2d330 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
2d340 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
2d350 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
2d360 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
2d370 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
2d380 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
2d390 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
2d3a0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
2d3b0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
2d3c0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
2d3d0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2d3e0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
2d3f0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
2d400 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
2d410 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
2d420 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
2d430 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
2d440 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
2d450 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
2d460 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
2d470 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
2d480 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2d490 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
2d4a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2d4b0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2d4c0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2d4d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2d4e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2d4f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
2d500 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
2d510 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2d520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d530 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2d540 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2d550 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2d560 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2d570 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
2d580 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
2d590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
2d5a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2d5b0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
2d5c0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2d5d0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2d5e0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2d5f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2d610 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2d620 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
2d630 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2d640 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
2d650 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
2d660 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
2d670 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
2d680 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
2d690 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2d6a0 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
2d6b0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
2d6c0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2d6d0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
2d6e0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
2d6f0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2d700 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
2d710 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
2d720 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
2d730 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
2d740 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
2d750 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
2d760 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
2d770 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
2d780 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
2d790 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
2d7a0 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
2d7b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2d7c0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
2d7d0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
2d7e0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
2d7f0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
2d800 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
2d810 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
2d820 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
2d830 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
2d840 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
2d850 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
2d860 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
2d870 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
2d880 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
2d890 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
2d8a0 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
2d8b0 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
2d8c0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2d8d0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
2d8e0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
2d8f0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
2d900 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
2d910 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
2d920 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
2d930 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2d940 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
2d950 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
2d960 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2d970 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
2d980 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
2d990 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2d9a0 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
2d9b0 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
2d9c0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
2d9d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d9e0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2d9f0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
2da00 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2da10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2da20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2da30 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2da40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2da50 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2da60 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2da70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2da80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2da90 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2daa0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2dab0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2dac0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
2dad0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20  r->tempFile .   
2dae0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42    && (pPager->pB
2daf0 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
2db00 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2db10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2db20 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  >0) .    ){.    
2db30 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
2db40 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
2db50 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
2db60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2db70 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
2db80 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
2db90 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
2dba0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
2dbb0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
2dbc0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
2dbd0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
2dbe0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
2dbf0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
2dc00 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2dc10 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
2dc20 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
2dc30 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
2dc40 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
2dc50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
2dc60 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
2dc70 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
2dc80 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
2dc90 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
2dca0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
2dcb0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2dcc0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
2dcd0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
2dce0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
2dcf0 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
2dd00 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
2dd10 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
2dd20 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
2dd30 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
2dd40 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
2dd50 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
2dd60 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
2dd70 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
2dd80 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
2dd90 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
2dda0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
2ddb0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
2ddc0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
2ddd0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
2dde0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
2ddf0 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
2de00 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
2de10 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
2de20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2de30 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
2de40 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
2de50 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
2de60 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2de70 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
2de80 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
2de90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2dea0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2deb0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2dec0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
2ded0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
2dee0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
2def0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
2df00 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
2df10 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
2df20 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
2df30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2df40 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
2df50 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
2df60 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2df70 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
2df80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2df90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2dfa0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2dfb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2dfc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
2dfd0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
2dfe0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
2dff0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2e000 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
2e010 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
2e020 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
2e030 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
2e040 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
2e050 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
2e060 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
2e070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2e080 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
2e090 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
2e0a0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
2e0b0 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
2e0c0 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
2e0d0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
2e0e0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
2e0f0 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
2e100 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
2e110 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
2e120 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
2e130 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
2e140 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2e150 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
2e160 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
2e170 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
2e180 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
2e190 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
2e1a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2e1b0 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
2e1c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e1d0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2e1e0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
2e1f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
2e200 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
2e210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e220 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
2e230 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
2e240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e250 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2e260 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  PEN );.  }else{.
2e270 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2e280 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2e290 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
2e2a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
2e2b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
2e2c0 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
2e2d0 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
2e2e0 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
2e2f0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
2e300 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
2e310 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
2e320 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
2e330 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
2e340 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
2e350 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
2e360 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
2e370 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
2e380 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
2e390 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
2e3a0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
2e3b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2e3c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
2e3d0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
2e3e0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
2e3f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2e400 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68  f( (sqlite3Pcach
2e410 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2e420 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29  ->pPCache)==0) )
2e430 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
2e440 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
2e450 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
2e460 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66  ** Acquire a ref
2e470 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e  erence to page n
2e480 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61  umber pgno in pa
2e490 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61  ger pPager (a pa
2e4a0 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ge.** reference 
2e4b0 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a  has type DbPage*
2e4c0 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ). If the reques
2e4d0 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
2e4e0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2e4f0 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
2e500 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
2e510 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
2e520 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
2e530 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
2e540 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
2e550 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
2e560 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
2e570 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2e580 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
2e590 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2e5a0 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
2e5b0 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
2e5c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2e5d0 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
2e5e0 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
2e5f0 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
2e600 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
2e610 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2e620 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
2e630 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
2e640 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
2e650 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2e660 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
2e670 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
2e680 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
2e690 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
2e6a0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
2e6b0 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
2e6c0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
2e6d0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
2e6e0 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
2e6f0 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
2e700 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2e710 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
2e720 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2e730 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
2e740 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
2e750 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
2e760 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
2e770 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
2e780 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
2e790 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
2e7a0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
2e7b0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
2e7c0 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d  or if a .** non-
2e7d0 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61  zero value is pa
2e7e0 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f  ssed as the noCo
2e7f0 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ntent parameter 
2e800 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
2e810 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
2e820 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
2e830 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
2e840 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
2e850 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
2e860 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
2e870 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
2e880 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
2e890 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
2e8a0 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
2e8b0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
2e8c0 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
2e8d0 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
2e8e0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
2e8f0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
2e900 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  f the page. This
2e910 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73   occurs in two s
2e920 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f  eperate scenario
2e930 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
2e940 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
2e950 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
2e960 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e970 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
2e980 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
2e990 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
2e9a0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
2e9b0 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
2e9c0 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
2e9d0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
2e9e0 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
2e9f0 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
2ea00 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
2ea10 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
2ea20 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
2ea30 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
2ea40 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
2ea50 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
2ea60 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
2ea70 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
2ea80 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
2ea90 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
2eaa0 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
2eab0 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
2eac0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2ead0 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
2eae0 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
2eaf0 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
2eb00 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
2eb10 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
2eb20 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
2eb30 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
2eb40 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
2eb50 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
2eb60 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
2eb70 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
2eb80 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
2eb90 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
2eba0 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
2ebb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ebc0 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
2ebd0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
2ebe0 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
2ebf0 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
2ec00 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
2ec10 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
2ec20 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
2ec30 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
2ec40 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
2ec50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ec60 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
2ec70 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
2ec80 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
2ec90 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
2eca0 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
2ecb0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
2ecc0 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
2ecd0 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
2ece0 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
2ecf0 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
2ed00 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
2ed10 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
2ed20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
2ed30 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
2ed40 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
2ed50 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
2ed60 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
2ed70 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
2ed80 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
2ed90 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
2eda0 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
2edb0 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
2edc0 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
2edd0 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
2ede0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
2edf0 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
2ee00 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
2ee10 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
2ee20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
2ee30 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
2ee40 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
2ee50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ee60 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
2ee70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
2ee80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
2ee90 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
2eea0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2eeb0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2eec0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2eed0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
2eee0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
2eef0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
2ef00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
2ef10 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
2ef20 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
2ef30 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
2ef40 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
2ef50 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
2ef60 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
2ef70 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
2ef80 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
2ef90 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
2efa0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
2efb0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
2efc0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
2efd0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  r) );..  if( pgn
2efe0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
2eff0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2f000 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
2f010 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
2f020 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
2f030 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
2f040 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
2f050 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
2f060 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
2f070 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
2f080 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
2f090 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2f0a0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
2f0b0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
2f0c0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
2f0d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
2f0e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2f0f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
2f100 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2f110 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
2f120 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
2f130 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
2f140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f150 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
2f160 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
2f170 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2f180 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
2f190 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
2f1a0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
2f1b0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
2f1c0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
2f1d0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
2f1e0 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
2f1f0 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
2f200 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
2f210 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
2f220 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
2f230 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
2f240 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
2f250 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
2f260 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
2f270 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
2f280 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
2f290 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
2f2a0 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
2f2b0 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
2f2c0 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
2f2d0 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
2f2e0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2f2f0 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
2f300 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
2f310 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
2f320 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
2f330 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
2f340 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
2f350 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2f360 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
2f370 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
2f380 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
2f390 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
2f3a0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
2f3b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2f3c0 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
2f3d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
2f3e0 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
2f3f0 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
2f400 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
2f410 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
2f420 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
2f430 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ..    PAGER_INCR
2f440 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
2f450 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
2f460 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
2f470 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
2f480 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2f490 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
2f4a0 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
2f4b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
2f4c0 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
2f4d0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
2f4e0 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
2f4f0 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
2f500 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
2f510 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
2f520 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
2f530 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
2f540 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
2f550 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2f560 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f570 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
2f580 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
2f590 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2f5a0 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
2f5b0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e  >dbSize<(int)pgn
2f5c0 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c  o || noContent |
2f5d0 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
2f5e0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
2f5f0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
2f600 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
2f610 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
2f620 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
2f630 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
2f640 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
2f650 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
2f660 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
2f670 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
2f680 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
2f690 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
2f6a0 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
2f6b0 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
2f6c0 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
2f6d0 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
2f6e0 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
2f6f0 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
2f700 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
2f710 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2f720 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
2f730 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
2f740 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
2f750 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
2f760 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
2f770 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2f780 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
2f790 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
2f7a0 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
2f7b0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
2f7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
2f7d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
2f7e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
2f7f0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
2f800 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
2f810 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
2f820 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
2f830 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
2f840 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
2f850 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2f860 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
2f870 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2f880 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
2f890 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
2f8a0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2f8b0 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
2f8c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2f8d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
2f8e0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
2f8f0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2f900 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
2f910 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
2f920 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
2f930 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2f940 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2f950 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
2f960 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
2f970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f980 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
2f990 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
2f9a0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
2f9b0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
2f9c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f9d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2f9e0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
2f9f0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
2fa00 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2fa10 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
2fa20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
2fa30 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
2fa40 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
2fa50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2fa60 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
2fa70 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
2fa80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2fa90 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
2faa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2fab0 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
2fac0 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
2fad0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
2fae0 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  ;..  *ppPage = 0
2faf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2fb00 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
2fb10 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
2fb20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
2fb30 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
2fb40 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
2fb50 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
2fb60 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
2fb70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
2fb80 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
2fb90 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
2fba0 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65   cache. Also, re
2fbb0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a  turn 0 if the .*
2fbc0 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  * pager is in PA
2fbd0 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
2fbe0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2fbf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
2fc00 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  * or if the page
2fc10 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
2fc20 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
2fc30 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a  n SQLITE_FULL..*
2fc40 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
2fc50 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
2fc60 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
2fc70 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
2fc80 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
2fc90 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
2fca0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
2fcb0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
2fcc0 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
2fcd0 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
2fce0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
2fcf0 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
2fd00 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
2fd10 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
2fd20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2fd30 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
2fd40 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
2fd50 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
2fd60 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
2fd70 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
2fd80 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
2fd90 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
2fda0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
2fdb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2fdc0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
2fdd0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
2fde0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fdf0 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
2fe00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fe10 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
2fe20 41 44 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  ADER );.  sqlite
2fe30 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
2fe40 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
2fe50 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
2fe60 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
2fe70 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
2fe80 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
2fe90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
2fea0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2feb0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
2fec0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
2fed0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
2fee0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
2fef0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
2ff00 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
2ff10 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
2ff20 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
2ff30 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
2ff40 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
2ff50 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
2ff60 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
2ff70 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2ff80 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
2ff90 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
2ffa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2ffb0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
2ffc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
2ffd0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
2ffe0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
2fff0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
30000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
30010 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30020 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
30030 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
30040 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
30050 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
30060 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
30070 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
30080 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30090 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
300a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
300b0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
300c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
300d0 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
300e0 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
300f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
30100 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
30110 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
30120 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
30130 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
30140 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
30150 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
30160 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
30170 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
30180 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
30190 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
301a0 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
301b0 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
301c0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
301d0 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
301e0 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
301f0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
30200 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
30210 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
30220 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
30230 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
30240 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
30250 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
30260 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
30270 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
30280 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
30290 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
302a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
302b0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
302c0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
302d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
302e0 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
302f0 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
30300 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
30310 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
30320 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
30330 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
30340 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
30350 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
30360 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
30370 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
30380 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
30390 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
303a0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
303b0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
303c0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
303d0 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
303e0 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
303f0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
30400 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
30410 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
30420 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30430 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30440 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
30450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30460 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
30470 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
30480 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
30490 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
304a0 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
304b0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
304c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
304d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
304e0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
304f0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
30500 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
30510 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
30520 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
30530 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
30540 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
30550 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
30560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30570 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
30580 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
30590 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
305a0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
305b0 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
305c0 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
305d0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
305e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
305f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
30600 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
30610 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
30620 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30630 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
30640 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
30650 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
30660 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
30670 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
30680 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
30690 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
306a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
306b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
306c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
306d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
306e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
306f0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
30700 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
30710 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
30720 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
30730 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
30740 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
30750 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30760 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
30770 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
30780 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
30790 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
307a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
307b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
307c0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
307d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307e0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
307f0 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
30800 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
30810 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
30820 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
30830 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
30840 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
30850 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
30860 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
30870 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
30880 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
30890 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
308a0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
308b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
308c0 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  AL).          );
308d0 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
308e0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
308f0 52 49 54 45 0a 20 20 20 20 20 20 20 20 72 63 20  RITE.        rc 
30900 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
30910 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
30920 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
30930 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
30940 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
30950 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
30960 67 65 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ger).        );.
30970 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20    #else.        
30980 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
30990 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
309a0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
309b0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
309c0 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
309d0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
309e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
309f0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
30a00 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
30a10 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
30a20 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
30a30 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
30a40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30a50 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
30a60 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
30a70 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
30a80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
30a90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30aa0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
30ab0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
30ac0 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
30ad0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
30ae0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
30af0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
30b00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
30b10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
30b20 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
30b30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
30b40 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
30b50 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
30b60 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
30b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
30b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30b90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
30ba0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
30bb0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
30bc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
30bd0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
30be0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
30bf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30c00 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
30c10 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
30c20 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
30c30 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
30c40 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
30c50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30c60 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
30c70 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
30c80 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
30c90 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
30ca0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
30cb0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
30cc0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
30cd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
30ce0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
30cf0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
30d00 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
30d10 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
30d20 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
30d30 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
30d40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
30d50 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
30d60 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
30d70 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
30d80 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
30d90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
30da0 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
30db0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
30dc0 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
30dd0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
30de0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
30df0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
30e00 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
30e10 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
30e20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
30e30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
30e40 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
30e50 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
30e60 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
30e70 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
30e80 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
30e90 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
30ea0 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
30eb0 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
30ec0 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
30ed0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
30ee0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
30ef0 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
30f00 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
30f10 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
30f20 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
30f30 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
30f40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
30f50 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
30f60 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
30f70 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
30f80 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
30f90 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
30fa0 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
30fb0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
30fc0 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
30fd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
30fe0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
30ff0 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
31000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31020 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
31030 52 45 41 44 45 52 20 29 3b 0a 20 20 70 50 61 67  READER );.  pPag
31040 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
31050 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
31060 6f 72 79 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ory;..  if( pPag
31070 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31080 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20  R_READER ){.    
31090 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
310a0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
310b0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
310c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
310d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
310e0 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
310f0 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
31100 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
31110 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
31120 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
31130 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31140 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
31150 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
31160 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
31170 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
31180 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
31190 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
311a0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
311b0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
311c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
311d0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
311e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
311f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31210 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
31220 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
31230 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
31240 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
31250 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
31260 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
31270 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
31280 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
31290 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
312a0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
312b0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
312c0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
312d0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
312e0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
312f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
31300 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
31310 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
31320 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
31330 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
31340 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
31350 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
31360 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
31370 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
31380 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
31390 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
313a0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
313b0 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
313c0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
313d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
313e0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
313f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
31400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31410 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
31420 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
31430 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
31440 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
31450 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
31460 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
31470 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
31480 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
31490 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
314a0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
314b0 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
314c0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
314d0 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
314e0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
314f0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
31500 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31510 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
31520 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
31530 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
31540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
31550 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
31560 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
31570 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
31580 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
31590 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
315a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
315b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
315c0 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
315d0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
315e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
315f0 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
31600 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
31610 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
31620 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
31630 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
31640 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
31650 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
31660 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
31670 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
31680 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
31690 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
316a0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
316b0 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
316c0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
316d0 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
316e0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
316f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
31700 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
31710 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
31720 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
31730 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
31740 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
31750 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
31760 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
31770 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
31780 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
31790 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
317a0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
317b0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
317c0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
317d0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
317e0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
317f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
31800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
31810 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
31820 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
31830 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
31840 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
31850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
31860 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
31870 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
31880 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
31890 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
318a0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
318b0 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
318c0 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
318d0 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
318e0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
318f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31900 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
31910 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
31920 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
31930 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
31940 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
31950 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
31960 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
31970 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
31980 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
31990 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
319a0 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
319b0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
319c0 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
319d0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
319e0 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
319f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
31a00 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
31a10 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
31a20 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
31a30 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
31a40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
31a50 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
31a60 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
31a70 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
31a80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
31a90 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
31aa0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31ab0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
31ac0 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
31ad0 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
31ae0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
31af0 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
31b00 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
31b10 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
31b20 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
31b30 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
31b40 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
31b50 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
31b60 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
31b70 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
31b80 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31b90 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
31ba0 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
31bb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31bc0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
31bd0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
31be0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31bf0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
31c00 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
31c10 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
31c20 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
31c30 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
31c40 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76  or has been prev
31c50 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c  iously detected,
31c60 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65   report the same
31c70 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69   error.  ** agai
31c80 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  n. This should n
31c90 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74  ot happen, but t
31ca0 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65  he check provide
31cb0 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  s robustness. */
31cc0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
31cd0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
31ce0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
31cf0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
31d00 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
31d10 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
31d20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
31d30 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
31d40 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
31d50 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
31d60 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
31d70 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
31d80 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
31d90 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
31da0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
31db0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
31dc0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
31dd0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
31de0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
31df0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
31e00 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
31e10 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
31e20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
31e30 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
31e40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
31e50 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
31e60 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  if( pageInJourna
31e70 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52  l(pPg) && !subjR
31e80 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
31e90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
31ea0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
31eb0 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
31ec0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31ed0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
31ee0 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 7d  _CACHEMOD );.  }
31ef0 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
31f00 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
31f10 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
31f20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
31f30 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
31f40 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
31f50 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
31f60 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  r the checkpoint
31f70 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
31f80 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
31f90 20 20 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65      ** Higher le
31fa0 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76  vel routines hav
31fb0 65 20 61 6c 72 65 61 64 79 20 6f 62 74 61 69 6e  e already obtain
31fc0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
31fd0 20 6c 6f 63 6b 73 0a 20 20 20 20 2a 2a 20 74 6f   locks.    ** to
31fe0 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65   begin the write
31ff0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75  -transaction, bu
32000 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  t the rollback j
32010 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
32020 20 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 20   .    ** yet be 
32030 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f  open. Open it no
32040 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  w if this is the
32050 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
32060 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
32070 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
32080 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
32090 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
320a0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
320b0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
320c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
320d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
320e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
320f0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
32100 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
32110 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32120 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
32130 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
32140 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
32150 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
32160 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
32170 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
32180 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
32190 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
321a0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
321b0 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
321c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
321d0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
321e0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
321f0 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
32200 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
32210 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
32220 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
32230 29 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  ) && !pagerUseWa
32240 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
32250 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
32260 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
32270 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
32280 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
32290 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20  ->dbOrigSize && 
322a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
322b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  fd) ){.        u
322c0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
322d0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
322e0 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
322f0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
32300 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20  alOff;..        
32310 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
32320 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
32330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
32340 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
32350 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
32360 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
32370 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
32380 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
32390 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
323a0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
323b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
323c0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
323d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
323e0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
323f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
32400 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d  rnalHdr<=pPager-
32410 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
32420 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
32430 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
32440 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
32450 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
32460 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
32470 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
32480 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
32490 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20  *)pData2);..    
324a0 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
324b0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
324c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
324d0 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
324e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
324f0 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
32500 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
32510 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
32520 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  or the page..   
32530 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
32540 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
32550 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
32560 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
32570 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  c in.        ** 
32580 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
32590 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
325a0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
325b0 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
325c0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
325d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
325e0 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20  e. And if an IO 
325f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
32600 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20  le doing so,.   
32610 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72       ** then cor
32620 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
32630 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ow..        */. 
32640 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
32650 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
32660 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72  SYNC;..        r
32670 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
32680 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
32690 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
326a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
326b0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
326c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
326d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
326e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
326f0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
32700 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29  ageSize, iOff+4)
32710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32720 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
32730 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
32740 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
32750 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
32760 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  Off+pPager->page
32770 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a  Size+4, cksum);.
32780 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32790 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
327a0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
327b0 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
327c0 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
327d0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
327e0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
327f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
32800 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
32810 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
32820 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
32830 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
32840 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
32850 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
32860 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
32870 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
32880 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
32890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
328a0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
328b0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
328c0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
328d0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
328e0 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
328f0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
32900 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67  );..        pPag
32910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
32920 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  = 8 + pPager->pa
32930 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
32940 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
32950 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32960 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
32970 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
32980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
32990 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
329a0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
329b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
329c0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
329d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
329e0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
329f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
32a00 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
32a10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
32a20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
32a30 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
32a40 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
32a50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32a70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
32a80 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
32a90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
32aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32ac0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
32ad0 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
32ae0 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
32af0 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
32b00 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
32b10 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NC;.        }.  
32b20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
32b30 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
32b40 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
32b50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
32b60 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
32b70 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
32b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32b90 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
32ba0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
32bb0 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
32bc0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
32bd0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
32be0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
32bf0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
32c00 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
32c10 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
32c20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
32c30 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
32c40 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
32c50 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
32c60 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
32c70 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
32c80 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
32c90 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
32ca0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
32cb0 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
32cc0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
32cd0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
32ce0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
32cf0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
32d00 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
32d10 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
32d20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
32d30 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
32d40 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
32d50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
32d60 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
32d70 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
32d80 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
32d90 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
32da0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32db0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
32dc0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
32dd0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
32de0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
32df0 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
32e00 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
32e10 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
32e20 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
32e30 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
32e40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
32e50 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
32e60 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
32e70 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
32e80 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
32e90 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
32ea0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
32eb0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
32ec0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32ed0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
32ee0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
32ef0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
32f00 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
32f10 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
32f20 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
32f30 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
32f40 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
32f50 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
32f60 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
32f70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
32f80 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
32f90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
32fa0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
32fb0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
32fc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
32fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
32fe0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
32ff0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
33000 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
33010 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
33020 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
33030 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
33040 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
33050 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33060 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
33070 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
33080 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
33090 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
330a0 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
330b0 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
330c0 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
330d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
330e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
330f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
33100 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
33110 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33120 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
33130 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
33140 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
33150 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
33160 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53  .  if( nPagePerS
33170 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
33180 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
33190 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
331a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
331b0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
331c0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
331d0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
331e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
331f0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
33200 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
33210 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
33220 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  age = 0;        
33230 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33240 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
33250 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
33260 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
33270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33280 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
33290 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  er */.    int ne
332a0 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20  edSync = 0;     
332b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
332c0 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44  ny page has PGHD
332d0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a  R_NEED_SYNC */..
332e0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
332f0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c  oNotSyncSpill fl
33300 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
33310 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
33320 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20  ot allow.    ** 
33330 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
33340 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
33350 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
33360 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20   journaled by.  
33370 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
33380 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
33390 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
333a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
333b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
333c0 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
333d0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
333e0 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  pill++;..    /* 
333f0 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
33400 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
33410 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
33420 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
33430 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
33440 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
33450 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
33460 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
33470 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
33480 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
33490 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
334a0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
334b0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
334c0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
334d0 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
334e0 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
334f0 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67  PageCount = pPag
33500 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
33510 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
33520 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
33530 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
33540 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
33550 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
33560 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
33570 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
33580 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
33590 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
335a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
335b0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
335c0 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
335d0 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
335e0 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
335f0 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
33600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
33610 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
33620 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
33630 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
33640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
33650 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
33660 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
33670 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
33680 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
33690 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
336a0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
336b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
336c0 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
336d0 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
336e0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
336f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
33700 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
33710 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
33720 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
33730 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33740 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33750 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
33760 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
33770 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
33780 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
33790 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
337a0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
337b0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
337c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
337d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
337e0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
337f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33800 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
33810 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
33820 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
33830 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
33840 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
33850 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
33860 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
33870 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
33880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33890 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
338a0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
338b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
338c0 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45   If the PGHDR_NE
338d0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
338e0 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
338f0 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
33900 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
33910 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
33920 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
33930 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
33940 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
33950 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
33960 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
33970 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
33980 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
33990 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
339a0 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
339b0 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
339c0 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
339d0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
339e0 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
339f0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
33a00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33a10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
33a20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33a30 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  & needSync ){.  
33a40 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
33a50 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  DB );.      for(
33a60 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20  ii=0; ii<nPage; 
33a70 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
33a80 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
33a90 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
33aa0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
33ab0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
33ac0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
33ad0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
33ae0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
33af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
33b00 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
33b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33b20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
33b30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
33b40 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29  otSyncSpill==1 )
33b50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
33b60 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a  NotSyncSpill--;.
33b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
33b80 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
33b90 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
33ba0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33bb0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
33bc0 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
33bd0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
33be0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
33bf0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
33c00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
33c10 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
33c20 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
33c30 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
33c40 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
33c50 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
33c60 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
33c70 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
33c80 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
33c90 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
33ca0 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
33cb0 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
33cc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
33cd0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
33ce0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
33cf0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
33d00 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
33d10 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
33d20 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
33d30 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
33d40 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
33d50 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
33d60 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
33d70 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
33d80 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
33d90 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
33da0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
33db0 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
33dc0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
33dd0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
33de0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
33df0 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
33e00 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
33e10 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
33e20 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
33e30 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
33e40 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
33e50 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
33e60 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
33e70 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
33e80 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
33e90 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
33ea0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
33eb0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
33ec0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
33ed0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
33ee0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
33ef0 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
33f00 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
33f10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
33f20 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
33f30 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
33f40 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
33f50 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
33f60 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
33f70 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
33f80 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
33f90 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
33fa0 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
33fb0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
33fc0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
33fd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
33fe0 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
33ff0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
34000 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
34010 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
34020 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
34030 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20  T_WRITE;.#ifdef 
34040 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
34050 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
34060 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
34070 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
34080 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
34090 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
340a0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
340b0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
340c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
340d0 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
340e0 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
340f0 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
34100 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
34110 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
34120 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
34130 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
34140 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
34150 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73  rectMode flag is
34160 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
34170 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c   is done by call
34180 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
34190 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70  agerWrite() on p
341a0 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69  age 1, then modi
341b0 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
341c0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  ts of the.** pag
341d0 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20  e data. In this 
341e0 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69  case the file wi
341f0 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68  ll be updated wh
34200 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
34210 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
34220 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
34230 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f  * The isDirectMo
34240 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  de flag may only
34250 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
34260 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
34270 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
34280 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
34290 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
342a0 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
342b0 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
342c0 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
342d0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
342e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
342f0 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
34300 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
34310 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
34320 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
34330 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
34340 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
34350 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
34360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34370 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
34380 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
34390 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
343a0 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
343b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
343c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
343d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
343e0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
343f0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
34400 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34410 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
34420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34430 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
34440 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
34450 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e  * Declare and in
34460 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e  itialize constan
34470 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72  t integer 'isDir
34480 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a  ect'. If the.  *
34490 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
344a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
344b0 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  nabled in this b
344c0 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72  uild, then isDir
344d0 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74  ect.  ** is init
344e0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
344f0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
34500 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
34510 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74  parameter.  ** t
34520 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
34530 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
34540 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
34550 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
34560 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
34570 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   if the atomic-w
34580 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
34590 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e  n is not.  ** en
345a0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
345b0 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69   time, the compi
345c0 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65  ler can omit the
345d0 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27   tests of.  ** '
345e0 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c  isDirect' below,
345f0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
34600 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69  block enclosed i
34610 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20  n the.  ** "if( 
34620 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64  isDirect )" cond
34630 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ition..  */.#ifn
34640 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
34650 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23  E_ATOMIC_WRITE.#
34660 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
34670 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20  ODE 0.  assert( 
34680 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
34690 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
346a0 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
346b0 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  de);.#else.# def
346c0 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
346d0 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e  isDirectMode.#en
346e0 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67  dif..  if( !pPag
346f0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
34700 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
34710 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
34720 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
34730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34740 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
34750 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63  e 1 */.    u32 c
34760 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20  hange_counter;  
34770 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
34780 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61  ial value of cha
34790 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
347a0 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  d */..    assert
347b0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
347c0 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ile && isOpen(pP
347d0 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
347e0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
347f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
34800 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
34810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34820 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
34830 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61   &pPgHdr);.    a
34840 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30  ssert( pPgHdr==0
34850 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
34860 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
34870 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74  page one was fet
34880 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ched successfull
34890 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  y, and this func
348a0 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20  tion is not.    
348b0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  ** operating in 
348c0 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b  direct-mode, mak
348d0 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c  e page 1 writabl
348e0 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20  e.  When not in 
348f0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d  .    ** direct m
34900 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61  ode, page 1 is a
34910 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61  lways held in ca
34920 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68  che and hence th
34930 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20  e PagerGet().   
34940 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77   ** above is alw
34950 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d  ays successful -
34960 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59   hence the ALWAY
34970 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f  S on rc==SQLITE_
34980 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  OK..    */.    i
34990 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20  f( !DIRECT_MODE 
349a0 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51  && ALWAYS(rc==SQ
349b0 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
349c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
349d0 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
349e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
349f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34a00 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65  {.      /* Incre
34a10 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
34a20 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
34a30 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
34a40 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20  te 24. */.      
34a50 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
34a60 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
34a70 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
34a80 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20  FileVers);.     
34a90 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
34aa0 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  +;.      put32bi
34ab0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
34ac0 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  r->pData)+24, ch
34ad0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
34ae0 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74        /* Also st
34af0 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
34b00 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
34b10 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e   bytes 96..99 an
34b20 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  d in.      ** by
34b30 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
34b40 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
34b50 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
34b60 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
34b70 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61 6c  .      ** is val
34b80 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75 74  id. */.      put
34b90 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
34ba0 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 32  PgHdr->pData)+92
34bb0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
34bc0 29 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  );.      put32bi
34bd0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
34be0 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  r->pData)+96, SQ
34bf0 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
34c00 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  BER);..      /* 
34c10 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
34c20 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
34c30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
34c40 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
34c50 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
34c60 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b  ( DIRECT_MODE ){
34c70 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
34c80 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20  oid *zBuf;.     
34c90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34ca0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
34cb0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
34cc0 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72  2(pPager, pPgHdr
34cd0 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72  ->pData, 1, 6, r
34ce0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
34cf0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69  zBuf);.        i
34d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
34d20 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
34d30 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  e(pPager->fd, zB
34d40 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
34d50 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
34d60 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34d80 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
34d90 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
34da0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
34db0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
34dc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
34dd0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
34de0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
34df0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
34e00 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
34e10 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
34e20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
34e30 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
34e40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34e50 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
34e60 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
34e70 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
34e80 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
34e90 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77  es.** or pages w
34ea0 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f  ith the Pager.no
34eb0 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a  Sync flag set..*
34ec0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
34ed0 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e  ul, or called on
34ee0 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
34ef0 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
34f00 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
34f10 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
34f20 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
34f30 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
34f40 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
34f50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
34f60 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
34f70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
34f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34fa0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
34fb0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
34fc0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
34fd0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
34fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
35000 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
35010 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
35020 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
35030 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
35040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
35050 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
35060 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c  y be called whil
35070 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  e a write-transa
35080 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
35090 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20  in.** rollback. 
350a0 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
350b0 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  n is in WAL mode
350c0 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  , this call is a
350d0 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65   no-op. .** Othe
350e0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
350f0 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nnection does no
35100 74 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  t already have a
35110 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
35120 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
35130 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74  base file, an at
35140 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
35150 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a   obtain one..**.
35160 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53  ** If the EXCLUS
35170 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  IVE lock is alre
35180 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20  ady held or the 
35190 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
351a0 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65  n it is.** succe
351b0 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f  ssful, or the co
351c0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57  nnection is in W
351d0 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f  AL mode, SQLITE_
351e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
351f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69  ** Otherwise, ei
35200 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59  ther SQLITE_BUSY
35210 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f   or an SQLITE_IO
35220 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
35230 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
35240 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
35250 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
35260 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
35270 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
35280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
35290 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
352a0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
352b0 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20  R_CACHEMOD .    
352c0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
352d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
352e0 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20  ER_DBMOD .      
352f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
35300 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35310 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20  _LOCKED .  );.  
35320 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
35330 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
35340 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70  r) );.  if( 0==p
35350 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
35360 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  r) ){.    rc = p
35370 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
35380 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
35390 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20  IVE_LOCK);.  }. 
353a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
353b0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
353c0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
353d0 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
353e0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
353f0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
35400 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
35410 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
35420 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
35430 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
35440 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
35450 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
35460 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
35470 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
35480 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
35490 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
354a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
354b0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
354c0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
354d0 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
354e0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
354f0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
35500 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
35510 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
35520 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
35530 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
35540 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
35550 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
35560 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
35570 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
35580 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
35590 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
355a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
355b0 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
355c0 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
355d0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
355e0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
355f0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
35600 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
35610 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
35620 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
35630 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
35640 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
35650 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
35660 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
35670 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
35680 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
35690 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
356a0 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
356b0 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
356c0 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
356d0 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
356e0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
356f0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
35700 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
35710 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
35720 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
35730 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
35740 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
35750 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
35760 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
35770 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
35780 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
35790 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
357a0 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
357b0 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
357c0 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
357d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
357e0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
357f0 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
35800 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
35810 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
35820 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
35830 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
35840 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
35850 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
35860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35870 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
35880 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
35890 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
358a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
358b0 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
358c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
358d0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
35900 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
35910 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
35920 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
35930 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
35940 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
35950 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
35960 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35970 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35980 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
35990 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
359a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
359b0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
359c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
359d0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
359e0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
359f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35a00 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20  GER_ERROR.  );. 
35a10 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
35a20 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
35a30 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
35a40 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
35a50 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
35a60 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
35a70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
35a80 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
35a90 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
35aa0 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  de;..  PAGERTRAC
35ab0 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E(("DATABASE SYN
35ac0 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
35ad0 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e  er=%s nSize=%d\n
35ae0 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
35af0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
35b00 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ster, pPager->db
35b10 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  Size));..  /* If
35b20 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61   no database cha
35b30 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d  nges have been m
35b40 61 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  ade, return earl
35b50 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  y. */.  if( pPag
35b60 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
35b70 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
35b80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
35b90 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  _OK;..  if( MEMD
35ba0 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  B ){.    /* If t
35bb0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
35bc0 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
35bd0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
35be0 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
35bf0 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  s.    ** functio
35c00 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
35c10 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
35c20 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e   mostly a no-op.
35c30 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20    However, any. 
35c40 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20     ** backup in 
35c50 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74  progress needs t
35c60 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  o be restarted..
35c70 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
35c80 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
35c90 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
35ca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
35cb0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
35cc0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35cd0 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
35ce0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
35cf0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
35d00 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 69 66  Cache);.      if
35d10 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
35d20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
35d30 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
35d40 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62  List, pPager->db
35d50 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20 20  Size, 1, .      
35d60 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 66        (pPager->f
35d70 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67 65 72  ullSync ? pPager
35d80 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20 30  ->sync_flags : 0
35d90 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
35da0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
35db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35dd0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
35de0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
35df0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35e00 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
35e10 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
35e20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
35e30 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
35e40 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20  tly how it.     
35e50 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65   ** does this de
35e60 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
35e70 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
35e80 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
35e90 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  zation.      ** 
35ea0 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
35eb0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64  ompile time, and
35ec0 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   if this transac
35ed0 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a  tion meets the .
35ee0 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65        ** runtime
35ef0 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
35f00 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
35f10 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
35f20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
35f30 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
35f40 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
35f50 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
35f60 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f       **      blo
35f70 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
35f80 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
35f90 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
35fa0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
35fb0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
35fc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
35fd0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  nd.      **    *
35fe0 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
35ff0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
36000 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
36010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36020 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
36030 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69    ** If the opti
36040 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74  mization was not
36050 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
36060 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74  ile time, then t
36070 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
36080 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
36090 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
360a0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
360b0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
360c0 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20       ** counter 
360d0 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64  in 'indirect-mod
360e0 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d  e'. If the optim
360f0 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69  ization is compi
36100 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20  led in but.     
36110 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69   ** is not appli
36120 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72  cable to this tr
36130 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20  ansaction, call 
36140 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
36150 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  eate().      ** 
36160 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
36170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
36180 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
36190 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
361a0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ll.      ** page
361b0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
361c0 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
361d0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
361e0 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
361f0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a        ** mode. .
36200 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36210 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
36220 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
36230 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64   is both enabled
36240 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c   and applicable,
36250 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  .      ** then c
36260 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
36270 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
36280 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
36290 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
362a0 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27    ** in 'direct'
362b0 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
362c0 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
362d0 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  file will never 
362e0 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  be.      ** crea
362f0 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
36300 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
36310 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  */.  #ifdef SQLI
36320 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
36330 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50 67 48  _WRITE.      PgH
36340 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61  dr *pPg;.      a
36350 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
36360 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
36370 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36380 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
36390 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
363a0 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
363b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
363c0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
363d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
363e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
363f0 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
36400 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
36410 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  d) .       && pP
36420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36430 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
36440 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
36450 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
36460 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze>=pPager->dbOr
36470 69 67 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26  igSize.       &&
36480 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
36490 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
364a0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
364b0 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
364c0 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b  pDirty).      ){
364d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
364e0 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
364f0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
36500 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
36510 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
36520 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
36530 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
36540 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d  odify the in-mem
36550 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
36560 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20  on of page 1 .  
36570 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c        ** to incl
36580 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20  ude the updated 
36590 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
365a0 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
365b0 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
365c0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
365d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
365e0 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
365f0 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20  tomic-write .   
36600 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
36610 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
36620 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
36630 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20  s safe..        
36640 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
36650 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
36660 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
36670 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
36680 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
36690 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
366a0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
366b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
366c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
366d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
366e0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
366f0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
36700 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36710 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20     }.  #else.   
36720 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
36730 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
36740 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 23  (pPager, 0);.  #
36750 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
36760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36770 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
36780 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
36790 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
367a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
367b0 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
367c0 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
367d0 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
367e0 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
367f0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
36800 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
36810 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
36820 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
36830 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
36840 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
36850 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
36860 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
36870 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
36880 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
36890 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
368a0 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 20   than the .     
368b0 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
368c0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
368d0 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
368e0 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
368f0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74        ** that it
36900 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
36910 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
36920 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
36930 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  , the.      ** c
36940 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
36950 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e  agerGet() return
36960 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e   zeroed pages in
36970 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20 20  stead of .      
36980 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20  ** reading data 
36990 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
369a0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
369b0 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 6a  .      ** When j
369c0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46  ournal_mode==OFF
369d0 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   the dbOrigSize 
369e0 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c 20  is always zero, 
369f0 73 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  so this.      **
36a00 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e   block never run
36a10 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  s if journal_mod
36a20 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20 2a 2f 0a  e=OFF..      */.
36a30 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
36a40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36a50 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36a60 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72  r->dbSize<pPager
36a70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
36a80 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
36a90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
36aa0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
36ab0 46 46 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  FF.      ){.    
36ac0 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 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 2f 2a                /*
36af0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
36b00 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  le */.        co
36b10 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
36b20 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
36b30 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
36b40 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
36b50 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67          const Pg
36b60 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
36b70 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
36b80 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
36b90 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
36ba0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
36bb0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
36bc0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
36bd0 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b    for( i=dbSize+
36be0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62  1; i<=pPager->db
36bf0 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  OrigSize; i++ ){
36c00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
36c10 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
36c20 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
36c30 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69  rnal, i) && i!=i
36c40 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
36c50 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
36c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
36c70 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
36c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
36c90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36ca0 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
36cb0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
36cc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36cd0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
36ce0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
36cf0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
36d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36d10 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
36d20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
36d30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
36d40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
36d50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36d60 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
36d70 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
36d80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
36d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36da0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
36db0 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d   dbSize;.      }
36dc0 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20   .  #endif.  .  
36dd0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
36de0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
36df0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
36e00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
36e10 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a   master .      *
36e20 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
36e30 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
36e40 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
36e50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36e60 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  , .      ** or i
36e70 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c  f zMaster is NUL
36e80 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  L (no master jou
36e90 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73  rnal), then this
36ea0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
36eb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36ec0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
36ed0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
36ee0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
36ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36f00 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
36f10 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
36f20 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e  .  .      /* Syn
36f30 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
36f40 6c 65 20 61 6e 64 20 77 72 69 74 65 20 61 6c 6c  le and write all
36f50 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
36f60 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
36f70 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
36f80 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
36f90 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  mization is bein
36fa0 67 20 75 73 65 64 2c 20 74 68 69 73 20 73 79 6e  g used, this syn
36fb0 63 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20  c will not .    
36fc0 20 20 2a 2a 20 63 72 65 61 74 65 20 74 68 65 20    ** create the 
36fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
36fe0 70 65 72 66 6f 72 6d 20 61 6e 79 20 72 65 61 6c  perform any real
36ff0 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   IO..      **.  
37000 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
37010 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
37020 72 20 70 61 67 65 20 77 61 73 20 6a 75 73 74 20  r page was just 
37030 6d 6f 64 69 66 69 65 64 2c 20 75 6e 6c 65 73 73  modified, unless
37040 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 74   the.      ** at
37050 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
37060 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
37070 20 69 74 20 69 73 20 61 6c 6d 6f 73 74 20 63 65   it is almost ce
37080 72 74 61 69 6e 20 74 68 61 74 20 74 68 65 0a 20  rtain that the. 
37090 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
370a0 72 65 71 75 69 72 65 73 20 61 20 73 79 6e 63 20  requires a sync 
370b0 68 65 72 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  here. However, i
370c0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
370d0 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 20 2a  xclusive.      *
370e0 2a 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 75 6e  * on a system un
370f0 64 65 72 20 6d 65 6d 6f 72 79 20 70 72 65 73 73  der memory press
37100 75 72 65 20 69 74 20 69 73 20 6a 75 73 74 20 70  ure it is just p
37110 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 69  ossible that thi
37120 73 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 6e  s is .      ** n
37130 6f 74 20 74 68 65 20 63 61 73 65 2e 20 49 6e 20  ot the case. In 
37140 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
37150 6c 69 6b 65 6c 79 20 65 6e 6f 75 67 68 20 74 68  likely enough th
37160 61 74 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  at the redundant
37170 0a 20 20 20 20 20 20 2a 2a 20 78 53 79 6e 63 28  .      ** xSync(
37180 29 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63  ) call will be c
37190 68 61 6e 67 65 64 20 74 6f 20 61 20 6e 6f 2d 6f  hanged to a no-o
371a0 70 20 62 79 20 74 68 65 20 4f 53 20 61 6e 79 68  p by the OS anyh
371b0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ow. .      */.  
371c0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
371d0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  rnal(pPager, 0);
371e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
371f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
37200 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
37210 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  _exit;.  .      
37220 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
37230 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
37240 2c 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69  ,sqlite3PcacheDi
37250 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
37260 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 20  pPCache));.     
37270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
37290 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
372a0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
372b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63  ;.        goto c
372c0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
372d0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
372e0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
372f0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
37300 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a 20  ->pPCache);.  . 
37310 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
37320 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
37330 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
37340 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
37350 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a 2a   image,.      **
37360 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f   then use pager_
37370 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77  truncate to grow
37380 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66   or shrink the f
37390 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
373a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
373b0 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61  ger->dbSize!=pPa
373c0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
373d0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
373e0 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64  nNew = pPager->d
373f0 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d  bSize - (pPager-
37400 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d  >dbSize==PAGER_M
37410 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
37420 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37430 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37440 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
37450 4d 4f 44 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MOD );.        r
37460 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
37470 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29  te(pPager, nNew)
37480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
374a0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
374b0 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
374c0 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69  }.  .      /* Fi
374d0 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20  nally, sync the 
374e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
374f0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  /.      if( !pPa
37500 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21  ger->noSync && !
37510 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
37520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37530 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
37540 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
37550 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ags);.      }.  
37560 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
37570 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
37580 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er)).    }.  }..
37590 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
375a0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d  _exit:.  if( rc=
375b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
375c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
375d0 72 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  r) ){.    pPager
375e0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
375f0 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
37600 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37610 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  c;.}.../*.** Whe
37620 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
37630 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64  is called, the d
37640 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
37650 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
37660 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72  .** updated to r
37670 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67  eflect the chang
37680 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63  es made by the c
37690 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
376a0 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64  on and.** synced
376b0 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f   to disk. The jo
376c0 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c  urnal file still
376d0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
376e0 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74  ile-system .** t
376f0 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20  hough, and if a 
37700 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61  failure occurs a
37710 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
37720 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a  will eventually.
37730 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ** be used as a 
37740 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
37750 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
37760 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62  saction rolled b
37770 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
37780 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a  function finaliz
37790 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
377a0 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64  ile, either by d
377b0 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75  eleting, .** tru
377c0 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69  ncating or parti
377d0 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c  ally zeroing it,
377e0 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e   so that it cann
377f0 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ot be used .** f
37800 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  or hot-journal r
37810 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68  ollback. Once th
37820 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74  is is done the t
37830 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
37840 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d   irrevocably com
37850 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
37860 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
37870 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
37880 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
37890 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  nd the pager.** 
378a0 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65  moves into the e
378b0 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65  rror state. Othe
378c0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
378d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
378e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
378f0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
37900 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
37910 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37920 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
37930 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
37940 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
37950 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
37960 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
37970 20 69 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   if a prior erro
37980 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
37990 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65    ** But if (due
379a0 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
379b0 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20  or elsewhere in 
379c0 74 68 65 20 73 79 73 74 65 6d 29 20 69 74 20 64  the system) it d
379d0 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c  oes get.  ** cal
379e0 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  led, just return
379f0 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20   the same error 
37a00 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69  code without doi
37a10 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a  ng anything. */.
37a20 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
37a30 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
37a40 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
37a50 72 43 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  rCode;..  assert
37a60 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37a70 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
37a80 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
37a90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37aa0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
37ab0 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  ISHED.       || 
37ac0 28 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  (pagerUseWal(pPa
37ad0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
37ae0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37af0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 29 0a 20  ITER_CACHEMOD). 
37b00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37b10 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37b20 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
37b30 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
37b40 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
37b50 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
37b60 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
37b70 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
37b80 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
37b90 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
37ba0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
37bb0 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
37bc0 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
37bd0 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
37be0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
37bf0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
37c00 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
37c10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37c20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
37c30 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
37c40 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
37c50 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
37c60 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
37c70 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
37c80 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
37c90 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
37ca0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
37cb0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
37cc0 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
37cd0 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
37ce0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
37cf0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
37d00 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
37d10 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
37d20 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
37d30 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
37d40 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
37d50 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
37d60 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
37d70 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
37d80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
37d90 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37da0 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 20 26 26 20  R_LOCKED .   && 
37db0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
37dc0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61  eMode .   && pPa
37dd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37de0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
37df0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b  ODE_PERSIST.  ){
37e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
37e20 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
37e30 70 50 61 67 65 72 29 20 7c 7c 20 21 70 50 61 67  pPager) || !pPag
37e40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
37e50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
37e60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
37e70 44 45 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  DER;.    return 
37e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
37e90 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
37ea0 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
37eb0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
37ec0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
37ed0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
37ee0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
37ef0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
37f00 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
37f10 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
37f20 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65 20 74  .** If a write t
37f30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
37f40 65 6e 2c 20 74 68 65 6e 20 61 6c 6c 20 63 68 61  en, then all cha
37f50 6e 67 65 73 20 6d 61 64 65 20 77 69 74 68 69 6e  nges made within
37f60 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63   the .** transac
37f70 74 69 6f 6e 20 61 72 65 20 72 65 76 65 72 74 65  tion are reverte
37f80 64 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  d and the curren
37f90 74 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  t write-transact
37fa0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  ion is closed..*
37fb0 2a 20 54 68 65 20 70 61 67 65 72 20 66 61 6c 6c  * The pager fall
37fc0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
37fd0 52 45 41 44 45 52 20 73 74 61 74 65 20 69 66 20  READER state if 
37fe0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 50  successful, or P
37ff0 41 47 45 52 5f 45 52 52 4f 52 0a 2a 2a 20 73 74  AGER_ERROR.** st
38000 61 74 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ate if an error 
38010 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
38020 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
38030 72 65 61 64 79 20 69 6e 20 50 41 47 45 52 5f 45  ready in PAGER_E
38040 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
38050 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
38060 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 69 74 20 72   called,.** it r
38070 65 74 75 72 6e 73 20 50 61 67 65 72 2e 65 72 72  eturns Pager.err
38080 43 6f 64 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  Code immediately
38090 2e 20 4e 6f 20 77 6f 72 6b 20 69 73 20 70 65 72  . No work is per
380a0 66 6f 72 6d 65 64 20 69 6e 20 74 68 69 73 20 63  formed in this c
380b0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ase..**.** Other
380c0 77 69 73 65 2c 20 69 6e 20 72 6f 6c 6c 62 61 63  wise, in rollbac
380d0 6b 20 6d 6f 64 65 2c 20 74 68 69 73 20 66 75 6e  k mode, this fun
380e0 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74  ction performs t
380f0 77 6f 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  wo functions:.**
38100 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c  .**   1) It roll
38110 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  s back the journ
38120 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69  al file, restori
38130 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  ng all database 
38140 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20  file and .**    
38150 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68    in-memory cach
38160 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73  e pages to the s
38170 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69  tate they were i
38180 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  n when the trans
38190 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77  action.**      w
381a0 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a  as opened, and.*
381b0 2a 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e  *.**   2) It fin
381c0 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
381d0 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74  al file, so that
381e0 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   it is not used 
381f0 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20  for hot.**      
38200 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20  rollback at any 
38210 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
38220 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  ure..**.** Final
38230 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ization of the j
38240 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 74 61 73  ournal file (tas
38250 6b 20 32 29 20 69 73 20 6f 6e 6c 79 20 70 65 72  k 2) is only per
38260 66 6f 72 6d 65 64 20 69 66 20 74 68 65 20 0a 2a  formed if the .*
38270 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 73 75  * rollback is su
38280 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20  ccessful..**.** 
38290 49 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 61 6c 6c  In WAL mode, all
382a0 20 63 61 63 68 65 2d 65 6e 74 72 69 65 73 20 63   cache-entries c
382b0 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74 61 20 6d  ontaining data m
382c0 6f 64 69 66 69 65 64 20 77 69 74 68 69 6e 20 74  odified within t
382d0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 72  he.** current tr
382e0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 65 69  ansaction are ei
382f0 74 68 65 72 20 65 78 70 65 6c 6c 65 64 20 66 72  ther expelled fr
38300 6f 6d 20 74 68 65 20 63 61 63 68 65 20 6f 72 20  om the cache or 
38310 72 65 76 65 72 74 65 64 20 74 6f 0a 2a 2a 20 74  reverted to.** t
38320 68 65 69 72 20 70 72 65 2d 74 72 61 6e 73 61 63  heir pre-transac
38330 74 69 6f 6e 20 73 74 61 74 65 20 62 79 20 72 65  tion state by re
38340 2d 72 65 61 64 69 6e 67 20 64 61 74 61 20 66 72  -reading data fr
38350 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
38360 6f 72 0a 2a 2a 20 57 41 4c 20 66 69 6c 65 73 2e  or.** WAL files.
38370 20 54 68 65 20 57 41 4c 20 74 72 61 6e 73 61 63   The WAL transac
38380 74 69 6f 6e 20 69 73 20 74 68 65 6e 20 63 6c 6f  tion is then clo
38390 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
383a0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
383b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
383c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
383d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
383e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
383f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45  n code */.  PAGE
38400 52 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43  RTRACE(("ROLLBAC
38410 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
38420 28 70 50 61 67 65 72 29 29 29 3b 0a 0a 20 20 2f  (pPager)));..  /
38430 2a 20 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  * PagerRollback(
38440 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  ) is a no-op if 
38450 63 61 6c 6c 65 64 20 69 6e 20 52 45 41 44 45 52  called in READER
38460 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   or OPEN state. 
38470 49 66 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  If.  ** the page
38480 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  r is already in 
38490 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
384a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73   the rollback is
384b0 20 6e 6f 74 20 0a 20 20 2a 2a 20 61 74 74 65 6d   not .  ** attem
384c0 70 74 65 64 20 68 65 72 65 2e 20 49 6e 73 74 65  pted here. Inste
384d0 61 64 2c 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ad, the error co
384e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
384f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
38500 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
38510 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
38520 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28  pPager) );.  if(
38530 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
38540 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 20 72  =PAGER_ERROR ) r
38550 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
38560 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 70 50 61  rCode;.  if( pPa
38570 67 65 72 2d 3e 65 53 74 61 74 65 3c 3d 50 41 47  ger->eState<=PAG
38580 45 52 5f 52 45 41 44 45 52 20 29 20 72 65 74 75  ER_READER ) retu
38590 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
385a0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
385b0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
385c0 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20  int rc2;.    rc 
385d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
385e0 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20  vepoint(pPager, 
385f0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
38600 43 4b 2c 20 2d 31 29 3b 0a 20 20 20 20 72 63 32  CK, -1);.    rc2
38610 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
38620 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
38630 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
38640 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
38650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
38660 3d 20 72 63 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = rc2;.  }else i
38670 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
38680 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
38690 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
386a0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
386b0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
386c0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
386d0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
386e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
386f0 61 67 65 72 5f 70 6c 61 79 62 61 63