/ Hex Artifact Content
Login

Artifact eee7ac31ce893ed6b7e28f907fe99144c0696953:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
3a50: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
3a60: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
3a70: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a90: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3aa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3ab0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3ac0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3ae0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3af0: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3b30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3b40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3b70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3b80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3b90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ba0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3bb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3bc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3bd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
3be0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3bf0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3c00: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3c10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3c20: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c40: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3c60: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3c80: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3c90: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
3ca0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
3cb0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
3cc0: 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  those class memb
3cd0: 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e  ers that are dyn
3ce0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f  amically.  ** mo
3cf0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f  dified during no
3d00: 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rmal operations.
3d10: 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61   The other varia
3d20: 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72  bles in this str
3d30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20  ucture.  ** are 
3d40: 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20  either constant 
3d50: 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c  throughout the l
3d60: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70  ifetime of the p
3d70: 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20  ager, or else.  
3d80: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
3d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
3da0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
3db0: 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68  ffect the way th
3dc0: 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70  e pager .  ** op
3dd0: 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  erates..  **.  *
3de0: 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61  * The 'state' va
3df0: 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69  riable is descri
3e00: 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61  bed in more deta
3e10: 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  il along with th
3e20: 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69  e.  ** descripti
3e30: 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ons of the value
3e40: 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20  s it may take - 
3e50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63  PAGER_UNLOCK etc
3e60: 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20  . Many of the.  
3e70: 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  ** other variabl
3e80: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
3e90: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69   are described i
3ea0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69  n the comment di
3eb0: 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f  rectly .  ** abo
3ec0: 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65  ve this class de
3ed0: 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  finition..  */. 
3ee0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
3f10: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
3f20: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64  , etc. */.  u8 d
3f30: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f50: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
3f60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3f70: 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  Db */.  u8 needS
3f80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3fa0: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3fb0: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3fc0: 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  al */.  u8 journ
3fd0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3ff0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
4000: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
4010: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4020: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4030: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4040: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4050: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
4060: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4080: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
4090: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
40a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
40b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
40d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
40e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
40f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
4100: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
4110: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
4120: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
4130: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
4140: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
4150: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4160: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
4170: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
4180: 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d  /.  u8 subjInMem
4190: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
41a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69  /* True to use i
41b0: 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
41c0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  rnals */.  Pgno 
41d0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4200: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
4210: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4230: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4240: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4250: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
4260: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
42a0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
42d0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
4310: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
4320: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
4330: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
4340: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
4350: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
4360: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
4370: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
4380: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
43b0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
43c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
43e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
43f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4420: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4430: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4440: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
4460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4470: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
4480: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4490: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
44a0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
44b0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
44c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
44d0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
44e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
44f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
4500: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4510: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
4520: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
4530: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
4540: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
4550: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4560: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4570: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4580: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4590: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
45a0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
45b0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
45c0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50  nal files */.  P
45d0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
45e0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
45f0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
4600: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
4610: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4630: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4640: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
4650: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4660: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4670: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4680: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4690: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
46a0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46c0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
46d0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
46e0: 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ck */..  u16 nEx
46f0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4710: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4720: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4730: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
4740: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
4750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4760: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
4770: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
4780: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
4790: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
47a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
47b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
47c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  n() */.  int pag
47d0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
47e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47f0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4800: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
4810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
4820: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
4830: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
4840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4850: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4880: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
4890: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
48a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
48b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
48c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
48d0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
48e0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
48f0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
4900: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
4910: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
4920: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4930: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
4940: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69  usyHandler */.#i
4950: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4960: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4970: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4980: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4990: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
49a0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49c0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49d0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49e0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
49f0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4a20: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4a40: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
4a50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
4a60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
4a70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
4a80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
4a90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
4aa0: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
4ab0: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
4ac0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
4ad0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
4ae0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
4af0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
4b00: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
4b10: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
4b20: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
4b30: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
4b40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b50: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
4b60: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
4b70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4b80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4b90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4ba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4bb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4bc0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
4bd0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
4be0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
4bf0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
4c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
4c10: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
4c30: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
4c40: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
4c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
4c70: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4c90: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
4ca0: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
4cb0: 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69 66  e=wal" */.#endif
4cc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4cd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4ce0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4cf0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4d00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4d10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4d20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4d30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4d40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4d50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4d60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4d70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4d90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4da0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4db0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4dc0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4dd0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4de0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4df0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4e00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4e10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4e20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4e30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4e40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4e50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4e60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4e70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
4e80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4e90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4ea0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4eb0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4ec0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
4ed0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
4ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
4ef0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
4f00: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
4f10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
4f20: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
4f30: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
4f40: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
4f50: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
4f60: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
4f70: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
4f80: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
4f90: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
4fa0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
4fb0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
4fc0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
4fd0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
4fe0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
4ff0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
5000: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
5010: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
5020: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
5030: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
5040: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
5050: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
5060: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
5070: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
5080: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
5090: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
50a0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
50b0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
50c0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
50d0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
50e0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
50f0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
5100: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
5110: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
5120: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
5130: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
5140: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
5150: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
5160: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
5170: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
5180: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
5190: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
51a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
51b0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
51c0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
51d0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
51e0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
51f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5200: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
5210: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
5220: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
5230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
5240: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
5250: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
5260: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
5270: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
5280: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
5290: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
52a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
52b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
52c0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
52d0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
52e0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
52f0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
5300: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
5310: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
5320: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
5330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
5340: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
5350: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
5360: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
5370: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
5380: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
5390: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
53a0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
53b0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
53c0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
53d0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
53e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
53f0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
5400: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
5410: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
5420: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
5430: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
5440: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
5450: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
5460: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
5470: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
5480: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
5490: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
54a0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
54b0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
54c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
54d0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
54e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
54f0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
5500: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
5510: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
5520: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
5530: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
5540: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
5550: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
5560: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5570: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5580: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5590: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
55a0: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
55b0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
55c0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
55d0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
55e0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
55f0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
5600: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
5610: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
5620: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
5630: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
5640: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
5650: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5660: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5670: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5680: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5690: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
56a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
56b0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
56c0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
56d0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
56e0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
56f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5700: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
5710: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
5720: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
5730: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
5740: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
5750: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
5760: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
5770: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
5780: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
5790: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
57a0: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
57b0: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
57c0: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
57d0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
57e0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
57f0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
5800: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
5810: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
5820: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
5830: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
5840: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
5850: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
5860: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
5870: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
5880: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
5890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
58a0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
58b0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
58c0: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
58d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
58e0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
58f0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
5900: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
5910: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
5920: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
5930: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
5940: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5950: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
5960: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
5970: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
5980: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
5990: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
59a0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
59b0: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
59c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
59d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
59e0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
59f0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
5a00: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
5a10: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
5a20: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
5a30: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
5a40: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
5a50: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
5a60: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
5a70: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
5a80: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
5a90: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
5aa0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5ab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5ac0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
5ad0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
5ae0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
5af0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
5b00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
5b10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
5b20: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
5b30: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
5b40: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
5b50: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
5b60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
5b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5b90: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
5ba0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
5bb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5bd0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
5be0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
5bf0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
5c00: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
5c10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
5c20: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
5c30: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
5c40: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
5c50: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5c60: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
5c70: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
5c80: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
5c90: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
5ca0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
5cb0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
5cc0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
5cd0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
5ce0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
5cf0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
5d00: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
5d10: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
5d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
5d30: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
5d40: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
5d50: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
5d60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5d70: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
5d80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
5d90: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
5da0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
5db0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5dc0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5dd0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5de0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5df0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5e00: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5e10: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5e20: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5e30: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5e40: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5e50: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5e60: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5e70: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5e80: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5e90: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5ea0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5eb0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5ec0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5ed0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5ee0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5ef0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5f00: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5f10: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
5f20: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
5f30: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
5f40: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
5f50: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
5f60: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
5f70: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
5f80: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
5f90: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
5fa0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
5fb0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
5fc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
5fd0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
5fe0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
5ff0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
6000: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
6010: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
6020: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
6030: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
6040: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
6050: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
6060: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
6070: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
6080: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
6090: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
60a0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
60b0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
60c0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
60d0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
60e0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
60f0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
6100: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
6110: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
6120: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
6130: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
6140: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
6150: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
6160: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
6170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
6190: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
61a0: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
61b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
61c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
61d0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
61e0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
61f0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
6200: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
6210: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
6220: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
6230: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
6240: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
6250: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
6260: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
6270: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
6280: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
6290: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
62a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
62b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
62c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
62d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
62e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
62f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
6300: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
6310: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
6320: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
6330: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
6340: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
6350: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
6360: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
6370: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
6380: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
6390: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
63a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
63b0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
63c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
63d0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
63e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
63f0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
6400: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
6410: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
6420: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
6430: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
6440: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
6450: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
6460: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
6470: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
6480: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
6490: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
64a0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
64b0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
64c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
64d0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
64e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
64f0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
6520: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
6530: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
6540: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
6550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
6560: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
6570: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
65a0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
65b0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
65c0: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
65d0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
65e0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
65f0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
6600: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
6610: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
6620: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
6630: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
6640: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
6650: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
6660: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
6670: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
6680: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
6690: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
66a0: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
66b0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
66c0: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
66d0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
66e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
66f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
6700: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
6710: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
6720: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
6730: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
6740: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
6750: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
6760: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
6770: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
6780: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
6790: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
67a0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
67b0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
67c0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
67d0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
67e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
67f0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
6800: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
6810: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
6820: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
6830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
6840: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
6850: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
6860: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
6870: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
6880: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6890: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
68a0: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
68b0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
68c0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
68d0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
68e0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
68f0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
6900: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
6910: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
6920: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
6930: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
6940: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
6950: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
6960: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
6970: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
6980: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
6990: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
69a0: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
69c0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
69d0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
69e0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
69f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6a00: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
6a10: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
6a20: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
6a30: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
6a40: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
6a50: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
6a60: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
6a70: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
6a80: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
6a90: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
6aa0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
6ab0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
6ac0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
6ad0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
6ae0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6af0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
6b00: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
6b10: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
6b20: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
6b30: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
6b40: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
6b50: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
6b60: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
6b70: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
6b80: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
6b90: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
6ba0: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
6bb0: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
6bc0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6bd0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
6be0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
6bf0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
6c00: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
6c10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6c20: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
6c30: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
6c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
6c50: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
6c60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6c70: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
6c80: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
6c90: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
6ca0: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
6cb0: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
6cc0: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
6cd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
6ce0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6cf0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
6d00: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
6d10: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
6d20: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
6d30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6d40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
6d50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
6d60: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
6d70: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
6d80: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
6d90: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
6da0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
6db0: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
6dc0: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
6dd0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
6de0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
6df0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
6e00: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
6e10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e20: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
6e30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
6e40: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
6e50: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
6e60: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
6e70: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
6e80: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
6e90: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
6ea0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
6eb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ec0: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
6ed0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
6ee0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
6ef0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6f00: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
6f10: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
6f20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
6f30: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
6f40: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
6f50: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
6f60: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
6f70: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
6f80: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
6f90: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
6fa0: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
6fb0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
6fc0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
6fd0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
6fe0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
6ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7000: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
7010: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
7020: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
7030: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
7040: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
7050: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7060: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
7070: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
7080: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
7090: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
70a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
70b0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
70c0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
70d0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
70e0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
70f0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
7100: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7120: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
7130: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
7140: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
7150: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
7160: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7170: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
71a0: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
71b0: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
71c0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71e0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
71f0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
7200: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7220: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
7230: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
7240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
7250: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
7260: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
7270: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
7280: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
7290: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
72a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
72b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
72c0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
72d0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
72e0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
72f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
7300: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
7310: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
7320: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
7330: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
7340: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
7350: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
7360: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
7370: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
7380: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
7390: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
73a0: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
73b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
73c0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
73d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
73e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
73f0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
7400: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
7410: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
7420: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
7430: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
7440: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
7450: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
7470: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
7480: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
7490: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
74a0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
74b0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
74c0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
74d0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
74e0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
74f0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
7500: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
7510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7520: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
7530: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
7540: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
7550: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
7560: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
7570: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
7580: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
7590: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
75a0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
75b0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
75c0: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
75d0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
75e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
75f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7600: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
7610: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
7620: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
7630: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
7640: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
7650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7660: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
7670: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
7680: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7690: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
76a0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
76b0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
76c0: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
76d0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
76e0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
76f0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
7720: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
7730: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
7740: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
7750: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
7760: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
7780: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
77b0: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
77c0: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
77d0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
77e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
77f0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
7800: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
7810: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
7820: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
7830: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
7840: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
7850: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
7860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7870: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
7880: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
7890: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
78a0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
78b0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
78c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
78d0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
78e0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
78f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
7900: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
7910: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
7920: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7930: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7940: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
7950: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
7960: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
7970: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
7980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
7990: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
79a0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
79b0: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
79c0: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
79d0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
79e0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
79f0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
7a00: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
7a10: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
7a20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
7a30: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
7a40: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
7a50: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
7a60: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
7a70: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
7a80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
7a90: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
7aa0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
7ab0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
7ac0: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
7ad0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
7ae0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
7af0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
7b00: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
7b10: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
7b20: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
7b30: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
7b40: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
7b50: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
7b60: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
7b70: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
7b80: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
7b90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
7ba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
7bb0: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
7bc0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
7bd0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
7be0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
7bf0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
7c00: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
7c10: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
7c20: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
7c30: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
7c40: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
7c50: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
7c60: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
7c70: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
7c80: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
7c90: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
7ca0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
7cb0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
7cc0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
7cd0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
7ce0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
7cf0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
7d00: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
7d10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d40: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7d50: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7d60: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
7d70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
7d80: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
7d90: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
7da0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7db0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
7dc0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
7dd0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
7de0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
7df0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
7e00: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
7e10: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
7e20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
7e30: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
7e40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
7e50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e60: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7e70: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
7e80: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
7e90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7ea0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7eb0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
7ec0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
7ed0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
7ee0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
7ef0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
7f00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7f10: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
7f20: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
7f30: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
7f40: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
7f50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
7f60: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
7f70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
7f80: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
7f90: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
7fa0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
7fb0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
7fc0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
7fd0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
7fe0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
7ff0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
8000: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
8010: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
8020: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
8030: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
8040: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
8050: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
8060: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
8070: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
8080: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
8090: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
80a0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
80b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
80c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
80d0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
80e0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
80f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
8100: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
8110: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
8120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8130: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
8140: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
8150: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8160: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
8170: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
8180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8190: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
81a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
81b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
81c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
81d0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
81e0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
81f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
8200: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
8210: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
8220: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
8230: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
8240: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
8250: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
8260: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
8270: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
8280: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
8290: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
82a0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
82b0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
82c0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
82d0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
82e0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
82f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
8300: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
8310: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
8320: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
8330: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
8340: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
8350: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
8360: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
8370: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
8380: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
8390: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
83a0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
83b0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
83c0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
83d0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
83e0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
83f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8400: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
8410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8420: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8430: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
8440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8450: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
8460: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
8470: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
8480: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
8490: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
84a0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
84b0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
84c0: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
84d0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
84e0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
84f0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
8500: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
8530: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
8540: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8570: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8580: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
8590: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
85a0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
85b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
85c0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
85d0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
85e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
85f0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
8600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8610: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
8620: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
8630: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
8640: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
8650: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
8660: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
8670: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
8680: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
8690: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
86a0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
86b0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
86c0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
86d0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
86e0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
86f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
8700: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8710: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
8720: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
8730: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
8740: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
8750: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8760: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
8770: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
8780: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
8790: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
87a0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
87b0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
87c0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
87d0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
87e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
87f0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
8800: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
8810: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
8820: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
8830: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
8840: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
8850: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
8860: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
8870: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
8880: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
8890: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
88a0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
88b0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
88c0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
88d0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
88e0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
88f0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
8900: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
8910: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
8920: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
8930: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
8940: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
8950: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
8960: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
8970: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
8980: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
8990: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
89a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
89b0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
89c0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
89d0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
89e0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
89f0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
8a00: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
8a10: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
8a20: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
8a30: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
8a40: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
8a50: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
8a60: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
8a70: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
8a80: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
8a90: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
8aa0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
8ab0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
8ac0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
8ad0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
8ae0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
8af0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
8b00: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
8b10: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
8b20: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
8b30: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
8b40: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
8b50: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
8b60: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
8b70: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
8b80: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
8b90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
8ba0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
8bb0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
8bc0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
8bd0: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  c );.  if( (pPag
8be0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
8bf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
8c00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8c10: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
8c20: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
8c30: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
8c40: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
8c50: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
8c60: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
8c70: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
8c80: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
8c90: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
8ca0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
8cb0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8cc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8cd0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
8ce0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
8cf0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61  .    memset(zHea
8d00: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  der, 0, sizeof(a
8d10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29  JournalMagic)+4)
8d20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
8d30: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
8d40: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
8d50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
8d60: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
8d70: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
8d80: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8d90: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
8da0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
8db0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8dc0: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
8dd0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
8de0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
8df0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
8e00: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
8e10: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
8e20: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
8e30: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
8e40: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
8e50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
8e60: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
8e70: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8e80: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8e90: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
8ea0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
8eb0: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
8ec0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
8ed0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8ee0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8ef0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
8f00: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
8f10: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
8f20: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
8f30: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
8f40: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
8f50: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
8f60: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
8f70: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
8f80: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
8f90: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
8fa0: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
8fb0: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
8fc0: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
8fd0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
8fe0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
8ff0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
9000: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
9010: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
9020: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9030: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
9040: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
9050: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9060: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
9070: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
9080: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
9090: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
90a0: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
90b0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
90c0: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
90d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
90e0: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
90f0: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
9100: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9110: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
9120: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
9130: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
9140: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
9150: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
9160: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
9170: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
9180: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
9190: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
91a0: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
91b0: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
91c0: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
91d0: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
91e0: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
91f0: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
9200: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
9210: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
9220: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
9230: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
9240: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
9250: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
9260: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
9270: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
9280: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
9290: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
92a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
92b0: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
92c0: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
92d0: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
92e0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
92f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
9300: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
9310: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
9320: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
9330: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
9340: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
9350: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
9360: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
9370: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
9380: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
9390: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
93a0: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
93b0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
93c0: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
93d0: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
93e0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
93f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
9400: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
9410: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
9420: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
9430: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9440: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
9450: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
9460: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
9470: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
9480: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
9490: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
94a0: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
94b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
94c0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
94d0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
94e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
94f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9500: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
9510: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9520: 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ff );.    pPager
9530: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9540: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
9550: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9560: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
9570: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
9580: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
9590: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
95a0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
95b0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
95c0: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
95d0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
95e0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
95f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
9600: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
9610: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9620: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
9630: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
9640: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
9650: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
9660: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
9670: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
9680: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
9690: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
96a0: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
96b0: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
96c0: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
96d0: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
96e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
96f0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
9700: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
9710: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
9720: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
9730: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
9740: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9750: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
9760: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
9770: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
9780: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
9790: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
97a0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
97b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
97c0: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
97d0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
97e0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
97f0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
9800: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
9810: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
9820: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
9830: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
9840: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
9850: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
9860: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
9870: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
9880: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
9890: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
98a0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
98b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
98c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
98d0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
98e0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
98f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
9900: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
9910: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c   */.  int isHot,
9920: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
9930: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
9940: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
9950: 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
9960: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
9970: 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20  32 *pNRec,      
9980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9990: 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
99a0: 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65  rom the nRec fie
99b0: 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62  ld */.  u32 *pDb
99c0: 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
99d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
99e0: 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64  ue of original d
99f0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65  atabase size fie
9a00: 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ld */.){.  int r
9a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9a20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9a30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69  n code */.  unsi
9a40: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
9a50: 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75  [8];     /* A bu
9a60: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
9a70: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
9a80: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75  /* Offset of jou
9ab0: 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e  rnal header bein
9ac0: 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  g read */..  ass
9ad0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
9ae0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
9af0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
9b00: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
9b10: 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  /..  /* Advance 
9b20: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
9b30: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
9b40: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
9b50: 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  . If the.  ** jo
9b60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f  urnal file is to
9b70: 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72  o small for ther
9b80: 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72  e to be a header
9b90: 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a   stored at this.
9ba0: 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75    ** point, retu
9bb0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
9bc0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
9bd0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
9be0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
9bf0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
9c00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
9c10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9c20: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
9c30: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9c40: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9c50: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
9c60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9c70: 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  f;..  /* Read in
9c80: 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74   the first 8 byt
9c90: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
9ca0: 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65  l header. If the
9cb0: 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20  y do not match. 
9cc0: 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73   ** the  magic s
9cd0: 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74  tring found at t
9ce0: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
9cf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
9d00: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
9d10: 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20  ITE_DONE. If an 
9d20: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
9d30: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
9d40: 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
9d50: 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  ,.  ** proceed..
9d60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74    */.  if( isHot
9d70: 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61   || iHdrOff!=pPa
9d80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9d90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9da0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
9db0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
9dc0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69  izeof(aMagic), i
9dd0: 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28  HdrOff);.    if(
9de0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
9df0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
9e00: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
9e10: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
9e20: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
9e30: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  c))!=0 ){.      
9e40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9e50: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
9e60: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72   /* Read the fir
9e70: 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20  st three 32-bit 
9e80: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f  fields of the jo
9e90: 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68  urnal header: Th
9ea0: 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c  e nRec.  ** fiel
9eb0: 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d  d, the checksum-
9ec0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20  initializer and 
9ed0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
9ee0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20  e at the start. 
9ef0: 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73   ** of the trans
9f00: 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61  action. Return a
9f10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
9f20: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
9f30: 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ong..  */.  if( 
9f40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
9f50: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
9f60: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9f70: 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c  +8, pNRec)).   |
9f80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9f90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9fa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9fb0: 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e  ff+12, &pPager->
9fc0: 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c  cksumInit)).   |
9fd0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9fe0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9ff0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a000: 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29  ff+16, pDbSize))
a010: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
a020: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
a030: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a040: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ff==0 ){.    u32
a050: 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20   iPageSize;     
a060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
a070: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
a080: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
a090: 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f  /.    u32 iSecto
a0a0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
a0b0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a     /* Sector-siz
a0c0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
a0d0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
a0e0: 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31 36   u16 iPageSize16
a0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a100: 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53 69   Copy of iPageSi
a110: 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61 72  ze in 16-bit var
a120: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  iable */..    /*
a130: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
a140: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
a150: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
a160: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
a170: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
a180: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
a190: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
a1a0: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
a1b0: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
a1c0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
a1d0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a1e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a1f0: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
a200: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
a210: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a220: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
a230: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
a240: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
a250: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
a260: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
a270: 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
a280: 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
a290: 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
a2a0: 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
a2b0: 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
a2c0: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
a2d0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
a2e0: 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
a2f0: 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
a300: 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
a310: 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
a320: 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
a330: 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
a340: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
a350: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
a360: 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
a370: 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
a380: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
a390: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
a3a0: 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
a3b0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
a3c0: 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
a3d0: 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
a3e0: 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
a3f0: 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
a400: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
a410: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
a420: 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
a430: 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
a440: 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
a450: 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
a460: 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
a470: 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
a480: 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
a490: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
a4a0: 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
a4b0: 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
a4c0: 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
a4d0: 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
a4e0: 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
a4f0: 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
a500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
a510: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a530: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
a540: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
a550: 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
a560: 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
a570: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a580: 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
a590: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
a5a0: 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
a5b0: 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
a5c0: 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
a5d0: 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
a5e0: 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
a5f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65      */.    iPage
a600: 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50  Size16 = (u16)iP
a610: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
a620: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
a630: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
a640: 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c 20  , &iPageSize16, 
a650: 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
a660: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
a670: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a680: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a690: 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75   iPageSize16==(u
a6a0: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
a6b0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
a6c0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a6d0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a6e0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a6f0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
a700: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
a710: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
a720: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
a730: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
a740: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
a750: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
a760: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
a770: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
a780: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
a790: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
a7a0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
a7b0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
a7c0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
a7d0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
a7e0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
a7f0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
a800: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
a810: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
a820: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
a830: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
a840: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
a850: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a860: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a870: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
a880: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
a890: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a8a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
a8b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
a8c0: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
a8d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
a8e0: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
a8f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
a900: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
a910: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
a920: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
a930: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
a940: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
a950: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
a960: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
a970: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
a980: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
a990: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
a9a0: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
a9b0: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
a9c0: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
a9d0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
a9e0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
a9f0: 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
aa00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
aa10: 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
aa20: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
aa30: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
aa40: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
aa50: 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
aa60: 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
aa70: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
aa90: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
aaa0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
aab0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
aac0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
aad0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
aae0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
aaf0: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
ab00: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
ab10: 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
ab20: 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
ab30: 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
ab40: 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
ab50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
ab60: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
ab70: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
ab80: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
ab90: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
aba0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
abb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
abc0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
abd0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
abe0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
abf0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ac00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ac30: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
ac40: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
ac50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ac60: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
ac70: 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
ac80: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
ac90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
aca0: 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
acb0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
acc0: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
acd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ace0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
acf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
ad00: 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
ad10: 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
ad20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
ad30: 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
ad40: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69   zMaster */..  i
ad50: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
ad60: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
ad70: 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
ad80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ad90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ada0: 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67  MORY .   || pPag
adb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
adc0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
add0: 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20  DE_OFF .  ){.   
ade0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
adf0: 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
ae00: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
ae10: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
ae20: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
ae30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae40: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
ae50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ae60: 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
ae70: 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
ae80: 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
ae90: 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
aea0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
aeb0: 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
aec0: 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
aed0: 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
aee0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
aef0: 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
af00: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
af10: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
af20: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
af30: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
af40: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
af50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
af60: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
af70: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
af80: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
af90: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
afa0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
afb0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
afc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
afd0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
afe0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
aff0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
b000: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
b010: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
b020: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b030: 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
b040: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b050: 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
b060: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b070: 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
b080: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b090: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
b0a0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
b0b0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
b0c0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
b0d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b0e0: 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
b0f0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
b100: 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
b110: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b120: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b130: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
b140: 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
b150: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b160: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b170: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b180: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
b190: 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
b1a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
b1b0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
b1c0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
b1d0: 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
b1e0: 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
b1f0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
b200: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
b210: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
b220: 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
b230: 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
b240: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b250: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
b260: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
b270: 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67  ster+20);.  pPag
b280: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
b290: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
b2a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
b2b0: 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
b2c0: 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
b2d0: 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
b2e0: 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
b2f0: 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
b300: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b310: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
b320: 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
b330: 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
b340: 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
b350: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
b360: 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
b370: 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
b380: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
b390: 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
b3a0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
b3b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
b3c0: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
b3d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
b3e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
b3f0: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
b400: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
b410: 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
b420: 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
b430: 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
b440: 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
b450: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
b460: 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
b470: 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
b480: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
b490: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
b4a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b4b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
b4c0: 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
b4d0: 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
b4e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
b4f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b500: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
b510: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
b520: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
b530: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b540: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
b550: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
b560: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
b570: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
b580: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
b590: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
b5a0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
b5b0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
b5c0: 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
b5d0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
b5e0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b5f0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b600: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b610: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b640: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
b650: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
b660: 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
b670: 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
b680: 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
b690: 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
b6a0: 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
b6b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
b6c0: 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
b6d0: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
b6e0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
b6f0: 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
b700: 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
b710: 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
b720: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
b730: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
b740: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b750: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
b760: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66  memory pages. If
b770: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 73  .** the pager is
b780: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b790: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
b7a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b7b0: 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20  * TODO: Why can 
b7c0: 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65  we not reset the
b7d0: 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20   pager while in 
b7e0: 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a  error state?.*/.
b7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b800: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
b810: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51  Pager){.  if( SQ
b820: 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d  LITE_OK==pPager-
b830: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b840: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
b850: 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
b860: 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ckup);.    sqlit
b870: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
b880: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
b890: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
b8a0: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
b8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b8c0: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
b8d0: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
b8e0: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
b8f0: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
b900: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
b910: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
b920: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
b930: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
b940: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
b950: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
b960: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
b970: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
b980: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
b990: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
b9a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b9b0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
b9c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
b9d0: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
b9e0: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
b9f0: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
ba00: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ba10: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ba20: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ba30: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
ba40: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ba50: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
ba60: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
ba70: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
ba80: 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
ba90: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
baa0: 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
bab0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
bac0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
bad0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
bae0: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
baf0: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
bb00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
bb10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
bb20: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
bb30: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
bb40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
bb50: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
bb60: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
bb70: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
bb80: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
bb90: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
bba0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
bbb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
bbc0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
bbd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
bbe0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
bbf0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
bc00: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
bc10: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
bc20: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
bc30: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
bc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bc60: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
bc70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
bc80: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bc90: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
bca0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
bcb0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
bcc0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
bcd0: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
bce0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
bcf0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
bd00: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
bd10: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
bd20: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
bd30: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
bd40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bd60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bd80: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
bd90: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
bda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bdb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
bdc0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
bdd0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
bde0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
bdf0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
be00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
be10: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
be20: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
be30: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
be40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
be50: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
be60: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
be70: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
be80: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
be90: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
bea0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
beb0: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
bec0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
bed0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
bee0: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
bef0: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
bf00: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
bf10: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
bf20: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
bf30: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
bf40: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
bf50: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bf60: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
bf70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
bf80: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
bf90: 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73  .** is in exclus
bfa0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ive mode..**.** 
bfb0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bfc0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
bfd0: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
bfe0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
bff0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
c000: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
c010: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
c020: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
c030: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
c040: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
c050: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
c060: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
c070: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
c080: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
c090: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
c0a0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
c0b0: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
c0c0: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
c0d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
c0e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
c0f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c100: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
c110: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
c120: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c130: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
c140: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c160: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
c170: 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
c180: 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
c190: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
c1a0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
c1b0: 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
c1c0: 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
c1d0: 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
c1e0: 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
c1f0: 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
c200: 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
c210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c220: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
c230: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
c240: 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
c250: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
c260: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
c270: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
c280: 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
c290: 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
c2a0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
c2b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
c2c0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c2d0: 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
c2e0: 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
c2f0: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
c300: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
c310: 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
c320: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
c330: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
c340: 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
c350: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
c360: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
c370: 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
c380: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
c390: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
c3a0: 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
c3b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
c3c0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
c3d0: 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
c3e0: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
c3f0: 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
c400: 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
c410: 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
c420: 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
c430: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
c440: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
c450: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c460: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
c470: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ..    sqlite3Bit
c480: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
c490: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
c4a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
c4b0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
c4c0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
c4d0: 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20  ints(pPager);.. 
c4e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
c4f0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73  e is unlocked, s
c500: 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67  omebody else mig
c510: 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68  ht change it. Th
c520: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
c530: 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
c540: 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68  dbSize etc. migh
c550: 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64  t become invalid
c560: 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   if.    ** this 
c570: 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61  happens.  One ca
c580: 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68 69  n argue that thi
c590: 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74  s doesn't need t
c5a0: 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20  o be cleared.   
c5b0: 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68   ** until the ch
c5c0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65  ange-counter che
c5d0: 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65  ck fails in Page
c5e0: 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20  rSharedLock().. 
c5f0: 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74     ** Clearing t
c600: 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 63  he page size cac
c610: 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e 67  he here is being
c620: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20   conservative.. 
c630: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
c640: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
c650: 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  0;..    if( page
c660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
c670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c680: 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
c690: 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
c6a0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
c6b0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c        rc = osUnl
c6c0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c6d0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  NO_LOCK);.    }.
c6e0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c6f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
c700: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  ode = rc;.    }.
c710: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c720: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
c730: 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er))..    /* If 
c740: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
c750: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
c760: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
c770: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
c780: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
c790: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
c7a0: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
c7b0: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
c7c0: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
c7d0: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
c7e0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
c7f0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
c800: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
c810: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c820: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
c830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c840: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
c850: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
c860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c870: 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f    }.      pager_
c880: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
c890: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
c8a0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
c8b0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
c8c0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
c8d0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61  _UNLOCK;.    pPa
c8e0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
c8f0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c900: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c910: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
c920: 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20   when an IOERR, 
c930: 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20  CORRUPT or FULL 
c940: 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76  error.** may hav
c950: 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20  e occurred. The 
c960: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
c970: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
c980: 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72  he pager .** str
c990: 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
c9a0: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
c9b0: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
c9c0: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
c9d0: 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69  r .** API functi
c9e0: 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
c9f0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
ca00: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
ca10: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74  rgument .** to t
ca20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
ca30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
ca40: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
ca50: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
ca60: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
ca70: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
ca80: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
ca90: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
caa0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
cab0: 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  t error is clear
cac0: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
cad0: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
cae0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
caf0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
cb00: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
cb10: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
cb20: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
cb30: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
cb40: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
cb50: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
cb60: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
cb70: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
cb80: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
cb90: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
cba0: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
cbb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
cbc0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
cbd0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
cbe0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
cbf0: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
cc00: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
cc10: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
cc20: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
cc30: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
cc40: 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
cc50: 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
cc60: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
cc70: 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
cc80: 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
cc90: 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
cca0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
ccb0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
ccc0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
ccd0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
cce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
ccf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
cd00: 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
cd10: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
cd20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
cd30: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
cd40: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
cd50: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
cd60: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
cd70: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
cd80: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
cd90: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
cda0: 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
cdb0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
cdc0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
cdd0: 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  de = rc;.  }.  r
cde0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cdf0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
ce00: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
ce10: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
ce20: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
ce30: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
ce40: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
ce50: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
ce60: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
ce70: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
ce80: 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
ce90: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
cea0: 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
ceb0: 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
cec0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
ced0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
cee0: 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
cef0: 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
cf00: 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
cf10: 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
cf20: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65  ase file and cle
cf30: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
cf40: 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  te. If this mean
cf50: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20  s that.** there 
cf60: 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
cf70: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
cf80: 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
cf90: 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  xt connection.**
cfa0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
cfb0: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
cfc0: 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
cfd0: 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69   be this one) wi
cfe0: 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61  ll.** roll it ba
cff0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
d000: 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
d010: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
d020: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
d030: 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
d040: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
d050: 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
d060: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
d070: 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
d080: 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
d090: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
d0a0: 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63 68  ror state. Which
d0b0: 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
d0c0: 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
d0d0: 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
d0e0: 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
d0f0: 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
d100: 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
d110: 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
d120: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d130: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
d140: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
d150: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
d160: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
d170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
d180: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
d190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d1a0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
d1b0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  r);.    sqlite3E
d1c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d1d0: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
d1e0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
d1f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d200: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
d210: 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
d220: 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
d230: 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
d240: 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
d250: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
d260: 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
d270: 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
d280: 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
d290: 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
d2a0: 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
d2b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
d2c0: 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d2e0: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
d2f0: 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
d300: 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
d310: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
d320: 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  tion..** .** If 
d330: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d340: 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20  PAGER_SHARED or 
d350: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
d360: 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
d370: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d380: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d390: 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45   (returns SQLITE
d3a0: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK)..**.** Othe
d3b0: 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
d3c0: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
d3d0: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
d3e0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
d3f0: 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
d400: 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
d410: 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
d420: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
d430: 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
d440: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
d450: 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
d460: 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
d470: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
d480: 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
d490: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
d4a0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
d4b0: 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
d4c0: 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
d4d0: 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
d4e0: 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
d4f0: 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
d500: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d510: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
d520: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
d530: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
d540: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
d550: 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
d560: 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
d570: 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
d580: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
d590: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
d5a0: 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
d5b0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
d5c0: 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
d5d0: 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
d5e0: 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
d5f0: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
d600: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
d610: 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
d620: 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
d630: 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
d640: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d650: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
d660: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
d670: 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
d680: 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
d690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d6a0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
d6b0: 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
d6c0: 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
d6d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
d6e0: 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
d6f0: 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
d700: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
d710: 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
d720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
d730: 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
d740: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
d750: 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
d760: 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
d770: 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
d780: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
d790: 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
d7a0: 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
d7b0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d7c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
d7d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
d7e0: 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
d7f0: 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
d800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d810: 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
d820: 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
d830: 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
d840: 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
d850: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
d860: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d870: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
d880: 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
d890: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d8a0: 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
d8b0: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
d8c0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
d8d0: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72   finalized, if r
d8e0: 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
d8f0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d900: 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73  e.** pager moves
d910: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
d920: 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e   state (and down
d930: 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20  grades the lock 
d940: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
d950: 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
d960: 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gly)..**.** If t
d970: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d980: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d990: 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20   mode and is in 
d9a0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
d9b0: 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20  te,.** it moves 
d9c0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
d9d0: 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65  VE. No locks are
d9e0: 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e   downgraded when
d9f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65   running in.** e
da00: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
da10: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
da20: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
da30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
da40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
da50: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
da60: 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
da70: 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
da80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
da90: 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
daa0: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
dab0: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
dac0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
dad0: 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
dae0: 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
daf0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
db00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
db10: 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
db20: 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
db30: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
db40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
db50: 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
db60: 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
db70: 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
db80: 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
db90: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
dba0: 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
dbb0: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
dbc0: 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
dbd0: 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
dbe0: 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
dbf0: 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
dc00: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dc10: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
dc20: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
dc30: 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
dc40: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
dc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc60: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dc70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
dc80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
dc90: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
dca0: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
dcb0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dcc0: 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
dcd0: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
dce0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  /..  if( pPager-
dcf0: 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
dd00: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
dd10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dd20: 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53   }.  releaseAllS
dd30: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
dd40: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  );..  assert( is
dd50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
dd60: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
dd70: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
dd80: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
dd90: 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61  r->jfd) ){.    a
dda0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
ddb0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
ddc0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
ddd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dde0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
ddf0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
de00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
de10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
de20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
de30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
de40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
de50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
de60: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
de80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
dea0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
deb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
dec0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
dee0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
def0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
df10: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
df20: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
df30: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
df40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
df50: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
df60: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
df70: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
df80: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
df90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
dfa0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
dfb0: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
dfc0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
dfd0: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
dfe0: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
dff0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
e000: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
e010: 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
e020: 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
e030: 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
e040: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
e050: 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
e060: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
e070: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
e080: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
e090: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e0a0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
e0b0: 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
e0c0: 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
e0d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
e0e0: 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
e0f0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
e100: 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
e110: 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
e120: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
e130: 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
e140: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
e150: 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
e160: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
e170: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
e180: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
e190: 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
e1a0: 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
e1b0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  y journal. .    
e1c0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
e1d0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
e1e0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e1f0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
e200: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
e210: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
e220: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
e230: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
e240: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
e250: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e270: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
e280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
e290: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
e2a0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
e2b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e2d0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e2e0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
e2f0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e300: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e310: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
e320: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
e330: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
e340: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
e350: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
e360: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
e370: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
e380: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
e390: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
e3a0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
e3b0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
e3c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
e3d0: 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  c = 0;.  sqlite3
e3e0: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
e3f0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
e400: 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
e410: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
e420: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
e430: 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
e440: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
e450: 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
e460: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
e470: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
e480: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
e490: 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ARED;..    /* If
e4a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
e4b0: 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  was in locking_m
e4c0: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
e4d0: 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
e4e0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70  ger,.    ** drop
e4f0: 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
e500: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e510: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
e520: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
e530: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
e540: 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
e550: 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
e560: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
e570: 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d 20   ){.      rc2 = 
e580: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
e590: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
e5a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
e5b0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
e5c0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
e5d0: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
e5e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
e5f0: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
e600: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e610: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
e620: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
e630: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
e640: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
e650: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
e660: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
e670: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
e680: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
e690: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
e6a0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
e6b0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
e6c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   0;.  pPager->db
e6d0: 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20  Modified = 0;.. 
e6e0: 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69   /* TODO: Is thi
e6f0: 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69  s optimal? Why i
e700: 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e  s the db size in
e710: 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a  validated here .
e720: 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61    ** when the da
e730: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
e740: 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a  ot unlocked? */.
e750: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
e760: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Size = 0;.  sqli
e770: 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
e780: 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
e790: 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
e7a0: 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  e);.  if( !MEMDB
e7b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e7c0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
e7d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
e7e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
e7f0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
e800: 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
e810: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
e820: 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
e830: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
e840: 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
e850: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
e860: 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
e870: 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
e880: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
e890: 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
e8a0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e8b0: 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
e8c0: 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
e8d0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
e8e0: 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
e8f0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
e900: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
e910: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
e920: 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
e930: 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
e940: 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
e950: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
e960: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
e970: 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
e980: 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
e990: 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
e9a0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
e9b0: 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
e9c0: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
e9d0: 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
e9e0: 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
e9f0: 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
ea00: 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
ea10: 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
ea20: 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
ea30: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
ea40: 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
ea50: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
ea60: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
ea70: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
ea80: 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
ea90: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
eaa0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
eab0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
eac0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
ead0: 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
eae0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
eaf0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
eb00: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
eb10: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
eb20: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
eb30: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
eb40: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
eb50: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
eb60: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
eb70: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
eb80: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
eb90: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
eba0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
ebb0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
ebc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
ebd0: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
ebe0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
ebf0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ec00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
ec10: 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
ec20: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
ec30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
ec40: 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
ec50: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ec60: 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
ec70: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
ec80: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
ec90: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
eca0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
ecb0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
ecc0: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65  ngle page from e
ecd0: 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ither the journa
ece0: 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69  l file (if isMai
ecf0: 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20  nJrnl==1) or.** 
ed00: 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
ed10: 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a  rnal (if isMainJ
ed20: 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79  rnl==0) and play
ed30: 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a  back that page..
ed40: 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69  ** The page begi
ed50: 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f  ns at offset *pO
ed60: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
ed70: 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65  ile. The *pOffse
ed80: 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e  t.** value is in
ed90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73  creased to the s
eda0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
edb0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
edc0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
edd0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20  isMainJrnl flag 
ede0: 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20  is true if this 
edf0: 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  is the main roll
ee00: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
ee10: 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68  .** false for th
ee20: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
ee30: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72  nal.  The main r
ee40: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
ee50: 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  uses.** checksum
ee60: 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
ee70: 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  t journal does n
ee80: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
ee90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
eea0: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
eeb0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
eec0: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
eed0: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
eee0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
eef0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
ef00: 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
ef10: 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
ef20: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
ef30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
ef40: 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
ef50: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
ef60: 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
ef70: 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
ef80: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
ef90: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
efa0: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
efb0: 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
efc0: 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
efd0: 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
efe0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
eff0: 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
f000: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
f010: 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
f020: 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
f030: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
f040: 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
f050: 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
f060: 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
f070: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
f080: 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
f090: 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
f0a0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
f0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
f0c0: 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
f0d0: 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
f0e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
f0f0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
f100: 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
f110: 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
f120: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
f130: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
f140: 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
f150: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
f160: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
f170: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f180: 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
f190: 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
f1a0: 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
f1b0: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
f1c0: 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
f1d0: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
f1e0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
f1f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
f200: 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
f210: 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
f220: 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
f230: 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
f240: 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
f250: 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
f260: 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
f270: 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
f280: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
f290: 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
f2a0: 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
f2b0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
f2c0: 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
f2d0: 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
f2e0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
f2f0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
f300: 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
f310: 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
f320: 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
f330: 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
f340: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
f350: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
f360: 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
f370: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
f380: 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
f390: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
f3a0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
f3b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
f3c0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
f3d0: 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
f3e0: 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
f3f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
f400: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
f410: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
f420: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
f430: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
f460: 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
f470: 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
f480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f490: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
f4a0: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
f4b0: 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
f4c0: 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
f4d0: 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
f4e0: 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
f4f0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
f500: 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f520: 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
f530: 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
f540: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
f550: 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
f560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
f570: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
f580: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
f590: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
f5a0: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
f5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
f5c0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
f5d0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
f5e0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f600: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
f610: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
f620: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
f630: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
f640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
f650: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
f660: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
f670: 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
f6a0: 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
f6b0: 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
f6c0: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
f6d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
f6e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
f6f0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
f700: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
f710: 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
f720: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f730: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
f740: 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
f750: 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
f760: 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
f770: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
f780: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
f790: 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
f7a0: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
f7b0: 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
f7c0: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
f7d0: 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
f7e0: 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
f7f0: 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
f800: 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
f810: 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
f820: 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
f830: 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
f840: 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
f850: 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
f860: 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
f870: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f880: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
f890: 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
f8a0: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
f8b0: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
f8c0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
f8d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
f8e0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
f8f0: 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
f900: 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
f910: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
f920: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
f930: 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
f940: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
f950: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
f960: 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
f970: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
f980: 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
f990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f9a0: 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
f9b0: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
f9c0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
f9d0: 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
f9e0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
f9f0: 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
fa00: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fa10: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
fa20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
fa30: 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
fa40: 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
fa50: 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
fa60: 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
fa70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
fa80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
fa90: 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
faa0: 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
fab0: 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
fac0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
fad0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
fae0: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
faf0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
fb00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
fb10: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
fb20: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
fb30: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
fb40: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
fb50: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
fb60: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
fb70: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
fb80: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
fb90: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
fba0: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
fbb0: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
fbc0: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
fbd0: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
fbe0: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
fbf0: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
fc00: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
fc10: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
fc20: 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
fc30: 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
fc40: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fc50: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
fc60: 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
fc70: 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
fc80: 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
fc90: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
fca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fcb0: 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
fcc0: 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
fcd0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
fce0: 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
fcf0: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
fd00: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
fd10: 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
fd20: 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
fd30: 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
fd40: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
fd50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fd60: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
fd70: 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   }..  if( pDone 
fd80: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
fd90: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
fda0: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
fdb0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
fdc0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
fdd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
fde0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
fdf0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
fe00: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
fe10: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
fe20: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
fe30: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
fe40: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
fe50: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
fe60: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
fe70: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
fe80: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
fe90: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
fea0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
feb0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
fec0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
fed0: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
fee0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
fef0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
ff00: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
ff10: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
ff20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
ff30: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
ff40: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
ff50: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
ff60: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
ff70: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
ff80: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
ff90: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
ffa0: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
ffb0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
ffc0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
ffd0: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
ffe0: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
fff0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
10000 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
10010 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
10020 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
10030 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
10040 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
10050 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
10060 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
10070 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
10080 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
10090 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
100a0 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
100b0 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
100c0 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
100d0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
100e0 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
100f0 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
10100 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
10110 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10120 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
10130 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
10140 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
10150 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
10160 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
10170 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10180 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10190 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
101a0 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
101b0 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
101c0 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
101d0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
101e0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
101f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
10200 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
10210 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
10220 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
10230 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
10240 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
10250 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
10260 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
10270 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
10280 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
10290 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
102a0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
102b0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
102c0 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
102d0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
102e0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
102f0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
10300 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
10310 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
10320 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
10330 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
10340 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
10350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10360 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
10370 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
10380 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
10390 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
103a0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
103b0 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
103c0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
103d0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
103e0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
103f0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
10400 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
10410 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
10420 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
10430 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
10440 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
10450 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
10460 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
10470 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
10480 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
10490 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
104a0 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
104b0 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
104c0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
104d0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
104e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
104f0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
10500 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
10510 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
10520 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
10530 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
10540 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
10550 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
10560 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
10570 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
10580 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
10590 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
105a0 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61  se{.    pPg = pa
105b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
105c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
105d0 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
105e0 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
105f0 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
10600 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
10610 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
10620 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
10630 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
10640 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
10650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
10660 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
10670 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
10680 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
10690 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
106a0 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
106b0 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
106c0 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
106d0 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
106e0 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
106f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
10700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
10710 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
10720 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
10730 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
10740 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
10750 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
10760 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
10770 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28 70  ).   && isOpen(p
10780 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
10790 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
107a0 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
107b0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
107c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
107d0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
107e0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
107f0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
10800 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
10810 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
10820 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
10830 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
10840 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10850 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
10860 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
10870 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
10880 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
10890 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
108a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
108b0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
108c0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
108d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
108e0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
108f0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
10900 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
10910 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
10920 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
10930 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
10940 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
10950 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
10960 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
10970 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
10980 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
10990 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
109a0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
109b0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
109c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
109d0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
109e0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
109f0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
10a00 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
10a10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
10a20 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
10a30 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
10a40 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
10a50 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
10a60 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
10a70 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
10a80 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
10a90 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
10aa0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
10ab0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
10ac0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
10ad0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
10ae0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
10af0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
10b00 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
10b10 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
10b20 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
10b30 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
10b40 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
10b50 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
10b60 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
10b70 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
10b80 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
10b90 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
10ba0 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
10bb0 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
10bc0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
10bd0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
10be0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
10bf0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
10c00 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
10c10 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
10c20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
10c30 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
10c40 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
10c50 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
10c60 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
10c70 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
10c80 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
10c90 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
10ca0 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
10cb0 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
10cc0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
10cd0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
10ce0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
10cf0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
10d00 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
10d10 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
10d20 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
10d30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
10d40 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
10d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
10d60 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
10d70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
10d80 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
10d90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
10da0 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
10db0 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
10dc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10dd0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
10de0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
10df0 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
10e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e10 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
10e20 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
10e30 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
10e40 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
10e50 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
10e60 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
10e70 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
10e80 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
10e90 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
10ea0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
10eb0 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
10ec0 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
10ed0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
10ee0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
10ef0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
10f00 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
10f10 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
10f20 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
10f30 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
10f40 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
10f50 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
10f60 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
10f70 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
10f80 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
10f90 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
10fa0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
10fb0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
10fc0 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
10fd0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
10fe0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
10ff0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
11000 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11010 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
11020 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
11030 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
11040 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
11050 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
11060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
11070 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
11080 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
11090 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
110a0 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
110b0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
110c0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
110d0 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
110e0 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
110f0 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
11100 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
11110 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
11120 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
11130 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
11140 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
11150 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
11160 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
11170 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
11180 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
11190 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
111a0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
111b0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
111c0 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
111d0 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
111e0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
111f0 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
11200 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
11210 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
11220 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
11230 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
11240 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
11250 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
11260 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
11270 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
11280 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
11290 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
112a0 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
112b0 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
112c0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
112d0 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
112e0 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
112f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
11300 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
11310 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
11320 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
11330 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
11340 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
11350 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
11360 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
11370 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
11380 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
11390 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
113a0 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
113b0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
113c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
113d0 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
113e0 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
113f0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
11400 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
11410 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
11420 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
11430 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
11440 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
11450 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
11460 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
11470 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
11480 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
11490 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
114a0 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
114b0 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
114c0 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
114d0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
114e0 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
114f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11500 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
11510 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
11520 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
11530 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
11540 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
11550 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
11560 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
11570 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
11580 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
11590 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
115a0 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
115b0 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
115c0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
115d0 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
115e0 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
115f0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
11600 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
11610 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
11620 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
11630 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
11640 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
11650 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
11660 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
11670 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
11680 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
11690 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
116a0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
116b0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
116c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
116d0 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
116e0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
116f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
11710 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
11720 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
11730 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11740 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
11750 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
11760 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
11770 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11780 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
11790 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
117a0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
117b0 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
117c0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
117d0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
117e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
117f0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
11800 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
11810 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
11820 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
11830 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
11840 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
11850 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
11860 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
11870 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11880 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
11890 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
118a0 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
118b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
118c0 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
118d0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
118e0 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
118f0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
11900 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
11910 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
11920 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
11930 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
11940 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
11950 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
11960 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
11970 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
11980 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11990 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
119a0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
119b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
119c0 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
119d0 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
119e0 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
119f0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
11a00 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
11a10 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
11a20 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
11a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
11a40 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
11a50 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
11a60 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
11a70 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
11a80 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
11a90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11aa0 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
11ab0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
11ac0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
11ad0 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
11ae0 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
11af0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
11b00 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
11b10 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
11b20 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
11b30 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
11b40 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11b50 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
11b60 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
11b70 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
11b80 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
11b90 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
11ba0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
11bb0 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
11bc0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
11bd0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11be0 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
11bf0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
11c00 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
11c10 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
11c20 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
11c30 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
11c40 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
11c50 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
11c60 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
11c70 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
11c80 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
11c90 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
11ca0 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
11cb0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
11cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
11cd0 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
11ce0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
11cf0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
11d00 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
11d10 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
11d20 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
11d30 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
11d40 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
11d50 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
11d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
11d70 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11d80 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
11d90 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
11da0 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
11db0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11dc0 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
11dd0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
11de0 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
11df0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
11e00 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
11e10 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11e20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11e30 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
11e40 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
11e50 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
11e60 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
11e70 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
11e80 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
11e90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11ea0 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
11eb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11ec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
11ed0 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
11ee0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
11ef0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
11f00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11f10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11f20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
11f30 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
11f40 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
11f50 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
11f60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
11f70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
11f80 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
11f90 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
11fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
11fb0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
11fc0 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
11fd0 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
11fe0 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
11ff0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
12000 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
12010 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
12020 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
12030 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
12040 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
12050 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12060 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
12070 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
12080 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
12090 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
120a0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
120b0 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
120c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
120d0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
120e0 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
120f0 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
12100 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
12110 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
12120 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
12130 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
12140 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
12150 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
12160 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
12170 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
12180 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12190 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
121a0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
121b0 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
121c0 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
121d0 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
121e0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
121f0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
12200 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
12210 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
12220 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
12230 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
12240 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12250 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
12260 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
12270 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
12280 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
12290 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
122a0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
122b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
122c0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
122d0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
122e0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
122f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
12300 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12310 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
12320 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
12330 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
12340 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
12350 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
12360 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
12370 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
12380 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
12390 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
123a0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
123b0 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
123c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
123d0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
123e0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
123f0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
12400 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
12410 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
12420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12430 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
12440 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
12450 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12460 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
12470 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
12480 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
12490 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
124a0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
124b0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
124c0 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
124d0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
124e0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
124f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12500 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12510 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
12520 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
12530 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
12540 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
12550 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
12560 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
12570 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
12580 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
12590 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
125a0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
125b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
125c0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
125d0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
125e0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
125f0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
12600 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
12610 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
12620 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
12630 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
12640 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
12650 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
12660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12670 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
12680 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
12690 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
126a0 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
126b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
126c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
126d0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
126e0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
126f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
12700 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
12710 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
12720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12730 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
12740 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
12750 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
12760 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
12770 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
12780 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
12790 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
127a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
127b0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
127c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
127d0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
127e0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
127f0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
12800 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
12810 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12820 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12830 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
12840 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
12850 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12870 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12880 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12890 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
128a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
128b0 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
128c0 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
128d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
128e0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
128f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12910 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12920 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12930 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
12940 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
12950 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
12960 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
12970 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
12980 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
12990 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
129a0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
129b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
129c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
129d0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
129e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
129f0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
12a00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12a10 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
12a20 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
12a30 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
12a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
12a50 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12a60 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
12a70 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
12a80 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
12a90 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
12aa0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
12ab0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
12ac0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
12ad0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
12ae0 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
12af0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
12b00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12b10 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
12b20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12b30 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
12b40 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
12b50 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
12b60 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
12b70 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
12b80 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
12b90 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
12ba0 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
12bb0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
12bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
12bd0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
12be0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
12bf0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
12c00 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
12c10 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
12c20 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
12c30 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
12c40 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
12c50 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
12c60 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
12c70 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
12c80 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
12c90 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
12ca0 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
12cb0 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
12cc0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
12cd0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
12ce0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
12cf0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
12d00 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
12d10 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
12d20 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
12d30 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
12d40 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
12d50 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
12d60 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
12d70 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
12d80 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
12d90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12da0 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
12db0 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
12dc0 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
12dd0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
12de0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
12df0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
12e00 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
12e10 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
12e20 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
12e30 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
12e40 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
12e50 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
12e60 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
12e70 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
12e80 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
12e90 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
12ea0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
12eb0 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
12ec0 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
12ed0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
12ee0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
12ef0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
12f00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12f10 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
12f20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
12f30 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
12f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12f50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12f60 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
12f70 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
12f80 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
12f90 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
12fa0 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
12fb0 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
12fc0 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
12fd0 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
12fe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12ff0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13000 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
13010 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
13020 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
13030 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
13040 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13050 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
13060 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
13070 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
13080 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
13090 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
130a0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
130b0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
130c0 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
130d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
130e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
130f0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
13100 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
13110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13130 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
13140 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
13150 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
13160 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13170 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13180 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
13190 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
131a0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
131b0 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
131c0 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
131d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
131e0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
131f0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
13200 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
13210 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
13220 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
13230 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
13240 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
13250 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
13260 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
13270 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
13280 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
13290 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
132a0 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
132b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
132c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
132d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
132e0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
132f0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
13300 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
13310 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
13320 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
13330 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
13340 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
13350 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
13360 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
13370 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
13380 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
13390 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
133a0 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
133b0 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
133c0 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
133d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
133e0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
133f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13400 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
13410 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
13420 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13430 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
13440 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
13450 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13460 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
13470 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
13480 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
13490 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
134a0 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
134b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
134c0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
134d0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
134e0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
134f0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
13500 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
13510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
13520 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
13530 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
13540 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
13550 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
13560 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
13570 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  32 ){.    pPager
13580 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
13590 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  12;.  }.  if( pP
135a0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
135b0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
135c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
135d0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
135e0 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67  =512 );.    pPag
135f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
13600 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
13610 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
13620 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
13630 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
13640 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
13650 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
13660 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
13670 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
13680 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
13690 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
136a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
136b0 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
136c0 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
136d0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
136e0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
136f0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
13700 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
13710 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
13720 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
13730 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
13740 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
13750 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
13760 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
13770 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
13780 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
13790 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
137a0 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
137b0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
137c0 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
137d0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
137e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
137f0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
13800 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
13810 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
13820 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
13830 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
13840 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13850 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
13860 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
13870 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
13880 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
13890 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
138a0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
138b0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
138c0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
138d0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
138e0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
138f0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
13900 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
13910 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
13920 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
13930 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
13940 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
13950 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
13960 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
13970 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
13980 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
13990 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
139a0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
139b0 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
139c0 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
139d0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
139e0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
139f0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
13a00 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
13a10 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
13a20 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
13a30 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
13a40 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
13a50 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
13a60 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
13a70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
13a80 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13a90 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
13aa0 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
13ab0 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
13ac0 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
13ad0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
13ae0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
13af0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
13b00 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
13b10 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
13b20 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
13b30 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
13b40 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
13b50 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13b60 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
13b70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
13b80 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
13b90 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
13ba0 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
13bb0 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
13bc0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
13bd0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
13be0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
13bf0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
13c00 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
13c10 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
13c20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
13c30 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
13c40 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
13c50 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
13c60 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
13c70 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13c80 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
13c90 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
13ca0 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
13cb0 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
13cc0 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
13cd0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
13ce0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
13cf0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
13d00 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
13d10 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13d20 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
13d30 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
13d40 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
13d50 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
13d60 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
13d70 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
13d80 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
13d90 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
13da0 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
13db0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
13dc0 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
13dd0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
13de0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
13df0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
13e00 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
13e10 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
13e20 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
13e30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
13e40 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
13e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13e60 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
13e70 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
13e80 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
13e90 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
13ea0 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
13eb0 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
13ec0 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
13ed0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
13ee0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
13ef0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
13f00 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
13f10 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
13f20 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
13f30 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
13f40 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
13f50 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
13f60 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
13f70 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
13f80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
13f90 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
13fa0 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
13fb0 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
13fc0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
13fd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
13fe0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
13ff0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
14000 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
14010 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
14020 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
14030 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
14040 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
14050 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14060 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
14070 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
14080 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
14090 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
140a0 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
140b0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
140c0 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
140d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
140e0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
140f0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
14100 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
14110 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
14120 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
14130 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
14140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
14150 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
14160 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
14170 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
14180 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
14190 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
141a0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
141b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
141c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
141d0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
141e0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
141f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14200 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
14210 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
14220 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
14230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
14240 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
14250 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
14260 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
14270 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
14280 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
14290 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
142a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
142b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
142c0 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
142d0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
142e0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
142f0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
14300 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
14310 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
14320 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
14330 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
14340 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
14350 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
14360 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
14370 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
14380 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
14390 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
143a0 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
143b0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
143c0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
143d0 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
143e0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
143f0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
14400 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
14410 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
14420 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
14430 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
14440 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
14450 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
14460 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
14470 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
14480 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
14490 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
144a0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
144b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
144c0 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
144d0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
144e0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
144f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
14500 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
14510 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
14520 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
14530 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
14540 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
14550 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
14560 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
14570 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
14580 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
14590 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
145a0 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
145b0 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
145c0 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
145d0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
145e0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
145f0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
14600 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
14610 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
14620 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
14630 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
14640 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14650 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
14660 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
14670 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
14680 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
14690 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
146a0 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
146b0 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
146c0 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
146d0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
146e0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
146f0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
14700 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
14710 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
14720 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
14730 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
14740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
14750 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
14760 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
14770 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
14780 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
14790 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
147a0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
147b0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
147c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
147d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
147e0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
147f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14800 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
14810 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
14820 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
14830 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
14840 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
14850 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
14860 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
14870 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
14880 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
14890 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
148a0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
148b0 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
148c0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
148d0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
148e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
148f0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
14900 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
14910 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
14920 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
14930 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14940 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
14950 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
14960 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
14970 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
14980 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
14990 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
149a0 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
149b0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
149c0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
149d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
149e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
149f0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
14a00 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
14a10 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
14a20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
14a40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14a50 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14a80 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14a90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14aa0 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
14ab0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
14ac0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
14ad0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
14ae0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
14af0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
14b00 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
14b10 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
14b20 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
14b30 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
14b40 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
14b50 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
14b60 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
14b70 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
14b80 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
14b90 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
14ba0 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
14bb0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
14bc0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
14bd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14be0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
14bf0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
14c00 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
14c10 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14c20 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
14c30 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
14c40 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
14c50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14c60 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
14c70 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
14c80 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
14c90 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
14ca0 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
14cb0 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
14cc0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
14cd0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
14ce0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
14cf0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
14d00 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
14d10 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
14d20 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
14d30 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
14d40 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
14d50 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
14d60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
14d70 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
14d80 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
14d90 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
14da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
14db0 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
14dc0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
14dd0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
14de0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
14df0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
14e00 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
14e10 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
14e20 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
14e30 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
14e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
14e50 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
14e60 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
14e70 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
14e80 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
14e90 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
14ea0 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
14eb0 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
14ec0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
14ed0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
14ee0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
14ef0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
14f00 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
14f10 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
14f20 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
14f30 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
14f40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
14f50 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
14f60 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
14f70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14f80 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
14f90 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
14fa0 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
14fb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
14fc0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
14fd0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
14fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14ff0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
15000 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
15010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15020 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
15030 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
15040 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
15050 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15060 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
15070 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
15080 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
15090 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
150a0 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
150b0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
150c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
150d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
150e0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
150f0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
15100 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
15110 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
15120 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15140 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
15150 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
15160 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
15170 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
15180 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
15190 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
151a0 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
151b0 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
151c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
151d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
151e0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
151f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
15200 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
15210 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
15220 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
15230 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
15240 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
15250 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
15260 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
15270 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
15280 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
15290 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
152a0 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
152b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
152c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
152d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
152e0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
152f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15300 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
15310 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15320 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
15330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
15350 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
15360 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
15370 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15380 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
15390 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70   truncated, simp
153a0 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  ly stop reading 
153b0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
153c0 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
153d0 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69  journal. This mi
153e0 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68  ght happen if th
153f0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  e journal was.  
15400 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63          ** not c
15410 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65  ompletely writte
15420 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69  n and synced pri
15430 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20  or to a crash.  
15440 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  In that.        
15450 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64    ** case, the d
15460 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68  atabase should h
15470 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77  ave never been w
15480 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20  ritten in the.  
15490 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
154a0 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20   place so it is 
154b0 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61  OK to simply aba
154c0 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  ndon the rollbac
154d0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
154e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
154f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
15500 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
15510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15520 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
15530 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
15540 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
15550 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
15560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
15570 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
15580 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
15590 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
155a0 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
155b0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
155c0 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
155d0 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
155e0 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
155f0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
15600 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
15610 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
15620 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
15630 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
15640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
15650 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
15660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15670 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
15680 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
15690 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
156a0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
156b0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
156c0 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
156d0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
156e0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
156f0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
15700 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
15710 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
15720 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
15730 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
15740 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
15750 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
15760 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
15770 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
15780 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
15790 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
157a0 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
157b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
157c0 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
157d0 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
157e0 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
157f0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
15800 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
15810 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
15820 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
15830 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15840 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
15850 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
15860 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
15870 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
15880 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15890 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
158a0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
158b0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
158c0 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
158d0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
158e0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
158f0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
15900 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
15910 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
15920 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
15930 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
15940 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
15950 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
15960 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
15970 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
15980 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
15990 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
159a0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
159b0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
159c0 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
159d0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
159e0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
159f0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
15a00 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
15a10 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
15a20 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
15a30 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
15a40 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
15a50 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
15a60 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
15a70 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
15a80 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
15a90 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
15aa0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
15ab0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
15ad0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
15ae0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
15af0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
15b00 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
15b10 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
15b20 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
15b30 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
15b40 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15b50 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
15b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15b70 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
15b80 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
15b90 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
15ba0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
15bb0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15bc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
15bd0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
15be0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
15bf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
15c00 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
15c10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15c20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
15c30 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15c40 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
15c50 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
15c60 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
15c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15c80 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
15c90 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
15ca0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
15cb0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
15cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15cd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15ce0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
15cf0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
15d00 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
15d10 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
15d20 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
15d30 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
15d40 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
15d50 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
15d60 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
15d70 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
15d80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
15d90 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
15da0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
15db0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
15dc0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
15dd0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
15de0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
15df0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
15e00 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
15e10 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
15e20 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
15e30 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
15e40 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
15e50 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
15e60 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
15e70 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
15e80 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
15e90 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
15ea0 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
15eb0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
15ec0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
15ed0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15ee0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
15ef0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
15f00 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
15f10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15f20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  and into .** pPg
15f30 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
15f40 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
15f50 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
15f60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
15f70 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
15f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15f90 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
15fa0 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
15fb0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
15fc0 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
15fd0 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
15fe0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
15ff0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
16000 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
16010 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
16020 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
16030 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
16040 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
16050 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
16060 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16070 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
16080 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
16090 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
160a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
160b0 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
160c0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
160d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
160e0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
160f0 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
16100 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
16110 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
16120 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
16130 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
16140 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
16150 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c  */.  int isInWal
16160 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16170 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67    /* True if pag
16180 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65  e is in log file
16190 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
161a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
161b0 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
161c0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
161d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
161e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
161f0 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44  _SHARED && !MEMD
16200 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
16210 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16220 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
16230 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  R(!isOpen(pPager
16240 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73  ->fd)) ){.    as
16250 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
16260 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65  mpFile );.    me
16270 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
16280 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
16290 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Size);.    retur
162a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
162b0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
162c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
162d0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
162e0 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
162f0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
16300 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
16310 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28   sqlite3WalRead(
16320 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
16330 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67  no, &isInWal, pg
16340 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
16350 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16360 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49  QLITE_OK && !isI
16370 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20  nWal ){.    i64 
16380 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
16390 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
163a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
163b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
163c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
163d0 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
163e0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
163f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
16400 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
16410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16420 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
16430 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
16440 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
16450 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16460 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
16470 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
16480 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
16490 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
164a0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
164b0 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
164c0 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
164d0 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
164e0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
164f0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
16500 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
16510 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
16520 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
16530 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
16540 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
16550 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
16560 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
16570 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
16580 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
16590 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
165a0 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
165b0 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
165c0 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
165d0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
165e0 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
165f0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
16600 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16610 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
16620 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
16630 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
16640 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
16650 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
16660 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
16670 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
16680 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
16690 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
166a0 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
166b0 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
166c0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
166d0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
166e0 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
166f0 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
16700 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
16710 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
16720 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
16730 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
16740 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
16750 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16760 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
16770 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
16780 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
16790 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
167a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
167b0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
167c0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
167d0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
167e0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
167f0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
16800 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
16810 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
16820 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
16830 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
16840 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
16850 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
16860 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
16870 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
16880 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
16890 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
168a0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
168b0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
168c0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
168d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
168e0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
168f0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
16900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
16910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
16920 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
16930 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
16940 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
16950 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
16960 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
16970 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16980 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
16990 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
169a0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
169b0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
169c0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
169d0 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
169e0 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
169f0 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
16a00 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
16a10 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
16a20 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
16a30 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
16a40 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
16a50 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
16a60 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
16a70 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
16a80 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
16a90 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
16aa0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
16ab0 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
16ac0 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
16ad0 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
16ae0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
16af0 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
16b00 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
16b10 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
16b20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
16b30 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
16b40 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
16b50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
16b60 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
16b70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
16b80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
16b90 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
16ba0 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
16bb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16bc0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
16bd0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
16be0 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
16bf0 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20   *pPg;..  pPg = 
16c00 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
16c10 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
16c20 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
16c30 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
16c40 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
16c50 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
16c60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
16c70 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
16c80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
16c90 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
16ca0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16cc0 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
16cd0 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
16ce0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16cf0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
16d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16d10 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
16d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
16d30 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
16d40 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
16d50 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
16d60 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
16d70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
16d80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16d90 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
16da0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
16db0 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
16dc0 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
16dd0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
16de0 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
16df0 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
16e00 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
16e10 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
16e20 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
16e30 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
16e40 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
16e50 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
16e60 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
16e70 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
16e80 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
16e90 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
16ea0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
16eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
16ec0 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
16ed0 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
16ee0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16ef0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
16f00 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
16f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16f20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16f30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
16f40 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
16f50 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
16f60 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
16f70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
16f80 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
16f90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
16fa0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fc0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
16fd0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
17000 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
17010 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
17020 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
17030 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
17040 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
17050 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
17060 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
17070 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
17080 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
17090 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
170a0 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
170b0 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
170c0 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
170d0 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
170e0 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
170f0 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
17100 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
17110 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
17120 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
17130 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
17140 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
17150 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
17160 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
17170 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
17180 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
17190 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
171a0 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
171b0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
171c0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
171d0 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
171e0 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
171f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
17200 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
17210 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
17220 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
17230 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
17240 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
17250 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
17260 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
17270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17280 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17290 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
172a0 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
172b0 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
172c0 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
172d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
172e0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
172f0 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
17300 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
17310 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
17320 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
17330 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
17340 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
17350 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
17360 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
17370 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
17380 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
17390 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
173c0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
173d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
173e0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
173f0 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
17400 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
17410 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17420 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
17430 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
17440 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
17450 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20  sCommit,        
17460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17470 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
17480 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17490 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20  sync_flags      
174a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
174b0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
174c0 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20  OsSync() (or 0) 
174d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
17500 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
17510 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
17520 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  l );.  rc = sqli
17530 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
17540 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
17550 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17560 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
17570 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
17580 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a  sync_flags.  );.
17590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
175a0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
175b0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
175c0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
175d0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
175e0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
175f0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
17600 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
17610 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
17620 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
17630 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
17650 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
17660 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
17670 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
17680 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
17690 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
176a0 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
176b0 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
176c0 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
176d0 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
176e0 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
176f0 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
17700 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
17710 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
17720 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
17730 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
17740 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
17750 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
17760 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
17770 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
17780 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17790 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
177a0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
177b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
177c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
177e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
177f0 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
17800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17810 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
17820 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
17830 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
17840 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17850 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  ) );..  /* sqlit
17860 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
17870 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
17880 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
17890 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
178a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
178b0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
178c0 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
178d0 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
178e0 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
178f0 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
17900 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
17910 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
17920 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
17930 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
17940 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
17950 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
17960 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
17970 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
17980 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
17990 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
179a0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
179b0 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
179c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
179d0 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b  {.    int dummy;
179e0 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 64  .    if( changed
179f0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
17a00 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17a20 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
17a30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
17a40 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lid==0 );.    }.
17a50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17a60 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17a70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a  Pager, &dummy);.
17a80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
17a90 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
17aa0 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ED;..  return rc
17ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
17ac0 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 65 6e   for the existen
17ad0 63 65 20 6f 66 20 6f 72 20 64 65 6c 65 74 65 20  ce of or delete 
17ae0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
17af0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
17b00 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
17b10 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
17b20 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ger..**.** When 
17b30 70 45 78 69 73 74 73 21 3d 4e 55 4c 4c 2c 20 73  pExists!=NULL, s
17b40 65 74 20 2a 70 45 78 69 73 74 73 20 74 6f 20 31  et *pExists to 1
17b50 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
17b60 6c 65 20 65 78 69 73 74 73 2c 20 6f 72 20 30 0a  le exists, or 0.
17b70 2a 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ** if the *-wal 
17b80 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
17b90 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ist..**.** When 
17ba0 70 45 78 69 73 74 73 3d 3d 4e 55 4c 4c 2c 20 64  pExists==NULL, d
17bb0 65 6c 65 74 65 20 74 68 65 20 2a 2d 77 61 6c 20  elete the *-wal 
17bc0 66 69 6c 65 20 69 66 20 69 74 20 65 78 69 73 74  file if it exist
17bd0 73 2c 20 6f 72 20 74 68 65 20 64 6f 0a 2a 2a 20  s, or the do.** 
17be0 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 2a  nothing if the *
17bf0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  -wal file does n
17c00 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ot exist..**.** 
17c10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17c20 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 49 66 20   on success. If 
17c30 6f 6e 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20  on an IO or OOM 
17c40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17c50 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  turn.** an SQLit
17c60 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
17c70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17c80 72 43 68 65 63 6b 46 6f 72 4f 72 44 65 6c 65 74  rCheckForOrDelet
17c90 65 57 41 4c 28 50 61 67 65 72 20 2a 70 50 61 67  eWAL(Pager *pPag
17ca0 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
17cb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
17ce0 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
17cf0 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
17d00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17d10 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   of the WAL file
17d20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
17d30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17d40 20 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c   );.  zWal = sql
17d50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
17d60 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e 7a  -wal", pPager->z
17d70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
17d80 20 21 7a 57 61 6c 20 29 7b 0a 20 20 20 20 72 63   !zWal ){.    rc
17d90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
17da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
17db0 28 20 70 45 78 69 73 74 73 20 29 7b 0a 20 20 20  ( pExists ){.   
17dc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17dd0 73 41 63 63 65 73 73 28 70 50 61 67 65 72 2d 3e  sAccess(pPager->
17de0 70 56 66 73 2c 20 7a 57 61 6c 2c 20 53 51 4c 49  pVfs, zWal, SQLI
17df0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
17e00 2c 20 70 45 78 69 73 74 73 29 3b 0a 20 20 20 20  , pExists);.    
17e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
17e20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
17e30 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
17e40 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  zWal, 0);.    }.
17e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17e60 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  (zWal);.  }.  re
17e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17e80 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
17e90 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
17ea0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
17eb0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
17ec0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
17ed0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
17ee0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
17ef0 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
17f00 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
17f10 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
17f20 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
17f30 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
17f40 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
17f50 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
17f60 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
17f70 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
17f80 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
17f90 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
17fa0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
17fb0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
17fc0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
17fd0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
17fe0 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
17ff0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
18000 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
18010 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
18020 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
18030 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
18040 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
18050 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
18060 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
18070 2a 2a 20 49 66 20 74 68 65 20 57 41 4c 20 66 69  ** If the WAL fi
18080 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 61 6c  le is opened, al
18090 73 6f 20 6f 70 65 6e 20 61 20 73 6e 61 70 73 68  so open a snapsh
180a0 6f 74 20 28 72 65 61 64 20 74 72 61 6e 73 61 63  ot (read transac
180b0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tion)..**.** The
180c0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
180d0 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
180e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
180f0 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
18100 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
18110 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
18120 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
18130 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
18140 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
18150 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
18160 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
18170 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
18180 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
18190 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
181a0 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
181b0 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
181c0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
181d0 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
181e0 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
181f0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
18200 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
18210 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
18220 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
18230 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18240 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
18250 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
18260 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18280 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
18290 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
182a0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
182c0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
182d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
182e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
182f0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
18300 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  _LOCK );.    rc 
18310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
18320 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
18330 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
18340 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18350 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
18360 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
18370 70 61 67 65 72 43 68 65 63 6b 46 6f 72 4f 72 44  pagerCheckForOrD
18380 65 6c 65 74 65 57 41 4c 28 70 50 61 67 65 72 2c  eleteWAL(pPager,
18390 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c   0);.      isWal
183a0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
183b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
183c0 72 43 68 65 63 6b 46 6f 72 4f 72 44 65 6c 65 74  rCheckForOrDelet
183d0 65 57 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73  eWAL(pPager, &is
183e0 57 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Wal);.    }.    
183f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18400 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
18410 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
18420 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
18430 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
18440 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18450 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
18460 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18490 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
184a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
184b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
184c0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
184d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
184e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
184f0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
18500 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18510 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
18520 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
18530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18550 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18560 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
18570 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
18580 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
18590 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
185a0 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
185b0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
185c0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
185d0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
185e0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
185f0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
18600 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
18610 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
18620 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
18630 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
18640 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
18650 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
18660 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
18670 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
18680 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
18690 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
186a0 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
186b0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
186c0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
186d0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
186e0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
186f0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
18700 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
18710 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
18720 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
18730 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
18740 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
18750 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
18760 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
18770 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
18780 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
18790 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
187a0 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
187b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
187c0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
187d0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
187e0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
187f0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
18800 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
18810 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
18820 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
18830 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
18840 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18850 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18860 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18870 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18880 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18890 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
188a0 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
188b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
188c0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
188d0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
188e0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
188f0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
18900 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
18910 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
18920 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
18930 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
18940 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18950 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18960 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18970 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18980 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18990 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
189a0 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
189b0 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
189c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
189d0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
189e0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
189f0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
18a00 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
18a10 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
18a20 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
18a30 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
18a40 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18a50 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18a60 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18a70 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18a80 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18a90 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18aa0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
18ab0 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
18ac0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
18ad0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
18ae0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
18af0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
18b00 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
18b10 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
18b20 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
18b30 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
18b40 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18b50 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18b60 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18b70 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18b80 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18b90 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18ba0 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
18bb0 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
18bc0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
18bd0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18be0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
18bf0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
18c00 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
18c10 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
18c20 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
18c30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
18c40 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18c50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18c60 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18c70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18c80 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18c90 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18ca0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
18cb0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
18cc0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
18cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
18ce0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
18cf0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
18d00 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
18d10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18d20 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
18d30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
18d40 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18d50 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18d60 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18d70 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18d80 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18d90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18da0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
18db0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18dc0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
18dd0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
18de0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
18df0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
18e00 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
18e10 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18e20 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18e30 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18e40 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18e50 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18e60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18e70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18e80 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18e90 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
18ea0 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
18eb0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
18ec0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
18ed0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
18ee0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
18ef0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
18f00 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18f10 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18f20 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18f30 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18f40 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18f50 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18f60 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18f70 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18f80 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18f90 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
18fa0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
18fb0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
18fc0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
18fd0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
18fe0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
18ff0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
19000 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
19010 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
19020 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
19030 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
19040 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
19050 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
19060 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
19070 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
19080 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
19090 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
190a0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
190b0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
190c0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
190d0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
190e0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
190f0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
19100 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
19110 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
19120 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
19130 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
19140 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
19150 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
19160 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
19170 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
19180 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
19190 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
191a0 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
191b0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
191c0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
191d0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
191e0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
191f0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
19200 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
19210 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
19220 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
19230 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
19240 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
19250 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
19260 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
19270 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
19280 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
19290 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
192a0 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
192b0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
192c0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
192d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
192e0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
192f0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
19300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19310 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19320 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
19330 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19340 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19350 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19360 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19370 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19380 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19390 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
193a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
193b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
193c0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
193d0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
193e0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
193f0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
19400 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
19410 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
19420 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
19430 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
19440 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
19450 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
19460 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
19470 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
19480 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
19490 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
194a0 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
194b0 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
194c0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
194d0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
194e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
194f0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
19500 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
19510 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
19520 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19530 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
19540 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
19550 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
19560 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
19570 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
19580 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
19590 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
195a0 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
195b0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
195c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
195d0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
195e0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
195f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
19600 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
19610 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
19620 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
19630 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
19640 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
19650 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
19660 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
19670 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
19680 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
19690 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
196a0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
196b0 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
196c0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
196d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
196e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
196f0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
19700 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
19710 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
19720 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
19730 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
19740 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19750 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
19760 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
19770 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
19780 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
19790 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
197a0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
197b0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
197c0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
197d0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
197e0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
197f0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
19800 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19810 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
19820 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19830 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
19850 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19860 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19870 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19880 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19890 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
198a0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
198b0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
198c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
198d0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
198e0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
198f0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
19900 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
19910 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
19920 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
19930 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
19940 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19950 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19960 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19970 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19980 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19990 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
199a0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
199b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
199c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
199d0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
199e0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
199f0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
19a00 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
19a10 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
19a20 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
19a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
19a40 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19a50 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19a60 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19a70 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19a80 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19a90 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19aa0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
19ab0 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
19ac0 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
19ad0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19ae0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19af0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
19b00 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
19b10 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
19b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19b40 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19b60 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19b70 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19b80 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19b90 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19ba0 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
19bb0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
19bc0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
19bd0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
19be0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
19bf0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
19c00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
19c10 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
19c20 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
19c30 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
19c40 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19c50 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19c60 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19c70 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19c80 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19c90 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19ca0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
19cb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
19cc0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
19cd0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
19ce0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
19cf0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
19d00 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
19d10 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
19d20 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
19d30 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
19d40 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19d50 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19d60 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19d70 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19d80 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19d90 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19da0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19db0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
19dc0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
19dd0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
19de0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
19df0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
19e00 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
19e10 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19e20 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19e30 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19e40 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19e50 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19e60 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19e70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19e80 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19e90 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
19ea0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
19eb0 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
19ec0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
19ed0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19ee0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
19ef0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19f00 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19f10 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19f20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19f30 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19f40 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19f50 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19f60 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19f70 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19f80 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19f90 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
19fa0 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
19fb0 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
19fd0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
19fe0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
19ff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a000 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1a010 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
1a020 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
1a030 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
1a040 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
1a050 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1a060 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
1a070 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
1a080 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
1a090 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
1a0a0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
1a0b0 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
1a0c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
1a0d0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
1a0e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a0f0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
1a100 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
1a110 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
1a120 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1a130 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
1a140 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
1a150 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
1a160 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
1a170 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
1a180 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
1a190 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
1a1a0 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
1a1b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a1c0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
1a1d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
1a1e0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
1a1f0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
1a200 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
1a210 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
1a220 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
1a230 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
1a240 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
1a250 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
1a260 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
1a270 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
1a280 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1a290 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
1a2a0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1a2b0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
1a2c0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
1a2d0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
1a2e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1a2f0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
1a300 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
1a310 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
1a320 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
1a330 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a340 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1a350 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
1a360 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1a370 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
1a380 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
1a390 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1a3a0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
1a3b0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
1a3c0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1a3d0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
1a3e0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a3f0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
1a400 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
1a410 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
1a420 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1a430 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
1a440 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
1a450 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
1a460 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
1a470 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
1a480 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
1a490 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
1a4a0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
1a4b0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1a4c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1a4d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a4e0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a4f0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
1a500 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1a510 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
1a520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a530 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
1a540 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1a550 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
1a560 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
1a570 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
1a580 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
1a590 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
1a5a0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
1a5b0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
1a5c0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1a5d0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
1a5e0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1a5f0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
1a600 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a620 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1a630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a640 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
1a650 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
1a660 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
1a670 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a680 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
1a690 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
1a6a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a6b0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a6c0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1a6d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a6e0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
1a6f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a700 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
1a710 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a720 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
1a730 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
1a740 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1a750 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a760 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
1a770 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a780 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a790 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
1a7a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1a7b0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
1a7c0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1a7d0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
1a7e0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
1a7f0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1a800 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1a810 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1a820 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1a830 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1a840 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1a850 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1a860 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1a870 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1a880 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1a890 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a8a0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1a8b0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1a8c0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1a8d0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1a8e0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1a8f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1a900 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1a910 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a920 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1a930 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1a940 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1a950 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1a960 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1a970 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1a980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a9a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a9b0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1a9c0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1a9d0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1a9e0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1a9f0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1aa00 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1aa10 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1aa20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1aa30 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1aa40 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1aa50 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1aa60 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1aa70 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1aa80 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1aa90 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1aaa0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1aab0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1aac0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1aad0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1aae0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1aaf0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1ab00 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1ab10 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1ab20 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1ab30 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1ab40 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab60 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1ab70 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1ab80 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1ab90 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1aba0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1abb0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1abc0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1abd0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1abe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1abf0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1ac00 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1ac10 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1ac20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1ac30 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1ac40 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1ac50 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1ac60 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1ac70 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1ac80 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1ac90 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1aca0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1acb0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1acc0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1acd0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1ace0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1acf0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1ad00 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1ad10 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1ad20 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1ad30 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1ad40 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1ad50 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1ad60 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1ad90 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1ada0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1adb0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1adc0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1add0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1ade0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1adf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1ae00 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1ae10 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1ae20 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1ae30 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1ae40 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1ae50 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1ae60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1ae70 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1ae80 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1ae90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1aea0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1aeb0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1aec0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1aed0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1aee0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1aef0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1af00 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1af10 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1af20 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1af30 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1af40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1af50 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1af60 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1af70 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1af80 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1af90 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1afa0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1afb0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1afc0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1afd0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1afe0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1aff0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1b000 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1b010 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1b020 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1b030 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1b040 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1b050 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1b060 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1b070 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1b080 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1b090 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1b0a0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1b0b0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1b0c0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1b0d0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1b0e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1b0f0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1b100 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1b110 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1b120 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1b130 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1b140 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1b150 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1b160 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1b170 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1b180 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1b190 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1b1a0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1b1b0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1b1c0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1b1d0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1b1e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1b1f0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1b200 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1b210 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1b220 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1b230 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1b240 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1b250 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1b260 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1b270 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1b280 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1b290 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1b2a0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1b2b0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1b2c0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1b2d0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1b2e0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1b2f0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1b300 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1b310 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1b320 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1b330 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1b340 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1b350 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1b360 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1b370 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1b380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b390 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1b3a0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1b3b0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1b3c0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1b3d0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1b3e0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1b3f0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1b400 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1b410 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1b420 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b430 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1b440 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1b450 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1b460 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1b470 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1b480 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1b490 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1b4a0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1b4b0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1b4c0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1b4d0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1b4e0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1b4f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b500 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1b510 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b520 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b530 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1b540 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1b550 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1b560 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1b570 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1b580 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1b590 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1b5a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b5b0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1b5c0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1b5d0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1b5e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b5f0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1b600 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1b610 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1b620 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1b630 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1b640 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1b650 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1b660 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1b670 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1b680 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1b690 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1b6a0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1b6b0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1b6c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b6d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1b6e0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1b6f0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1b700 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1b710 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1b720 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1b730 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1b740 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1b750 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1b760 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1b770 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1b780 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1b790 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1b7a0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1b7b0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1b7c0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1b7d0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1b7e0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1b7f0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1b800 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1b810 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1b820 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1b830 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1b840 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1b850 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1b860 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1b870 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1b880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b890 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1b8a0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1b8b0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1b8c0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1b8d0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1b8e0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1b8f0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b900 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1b910 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1b920 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1b930 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1b940 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b950 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1b960 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1b970 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1b980 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1b990 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1b9a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1b9b0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1b9c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1b9d0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1b9e0 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1b9f0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1ba00 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1ba10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1ba20 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1ba30 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1ba40 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ba50 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1ba60 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1ba70 28 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6d  ( (int)pPager->m
1ba80 78 50 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a  xPgno>=nPage );.
1ba90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
1baa0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
1bab0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1bac0 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
1bad0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
1bae0 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
1baf0 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
1bb00 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
1bb10 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
1bb20 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
1bb30 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
1bb40 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
1bb50 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
1bb60 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
1bb70 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
1bb80 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
1bb90 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
1bba0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
1bbb0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
1bbc0 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
1bbd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1bbe0 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
1bbf0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1bc00 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
1bc10 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
1bc20 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
1bc30 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
1bc40 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
1bc50 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1bc60 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
1bc70 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
1bc80 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
1bc90 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
1bca0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
1bcb0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
1bcc0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1bcd0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
1bce0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
1bcf0 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
1bd00 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1bd10 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
1bd20 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1bd30 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
1bd40 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1bd50 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
1bd60 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
1bd70 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
1bd80 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1bd90 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
1bda0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
1bdb0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
1bdc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1bdd0 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
1bde0 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
1bdf0 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
1be00 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
1be10 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
1be20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
1be30 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
1be40 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
1be50 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
1be60 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
1be70 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
1be80 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
1be90 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
1bea0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
1beb0 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
1bec0 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
1bed0 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
1bee0 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
1bef0 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
1bf00 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
1bf10 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
1bf20 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
1bf30 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
1bf40 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1bf50 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
1bf60 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
1bf70 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1bf80 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1bf90 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
1bfa0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
1bfb0 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
1bfc0 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
1bfd0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
1bfe0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
1bff0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
1c000 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
1c010 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
1c020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
1c030 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
1c040 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1c050 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1c060 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1c070 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  le );..  /* This
1c080 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
1c090 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65   called by btree
1c0a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
1c0b0 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  er creating.  **
1c0c0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
1c0d0 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f  t.  There has no
1c0e0 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74  t been an opport
1c0f0 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74  unity to transit
1c100 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20  ion.  ** to WAL 
1c110 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  mode yet..  */. 
1c120 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
1c130 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1c140 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 61 67  .#if 0.  if( pag
1c150 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1c160 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e   ){.    int isIn
1c170 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Wal = 0;.    rc 
1c180 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1c190 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
1c1a0 2c 20 26 69 73 49 6e 57 61 6c 2c 20 4e 2c 20 70  , &isInWal, N, p
1c1b0 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
1c1c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1c1d0 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 20  isInWal ){.     
1c1e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c1f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1c200 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1c210 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
1c220 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
1c230 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
1c240 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
1c250 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1c260 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
1c270 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
1c280 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1c290 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c2a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c2b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1c2c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c2d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
1c2e0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1c2f0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1c300 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
1c310 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50  ated .** with pP
1c320 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ager. Normally, 
1c330 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74  this is calculat
1c340 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20  ed as (<db file 
1c350 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65  size>/<page-size
1c360 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  >)..** However, 
1c370 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
1c380 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
1c390 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
1c3a0 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
1c3b0 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
1c3c0 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
1c3d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1c3e0 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f  pager is in erro
1c3f0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
1c400 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c410 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lled, then the.*
1c420 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  * error state er
1c430 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1c440 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1c450 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
1c460 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66   Or,.** if the f
1c470 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20 74  ile system has t
1c480 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72  o be queried for
1c490 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1c4a0 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65   file and.** the
1c4b0 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20 72   query attempt r
1c4c0 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72  eturns an IO err
1c4d0 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  or, the IO error
1c4e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1c4f0 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65  d.** and *pnPage
1c500 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
1c510 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
1c520 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69  ise, if everythi
1c530 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1c540 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
1c550 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1c560 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73  and *pnPage is s
1c570 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1c580 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1c590 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
1c5a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
1c5b0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1c5c0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
1c5d0 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1c5e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1c5f0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1c600 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1c610 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  */..  /* Determi
1c620 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
1c630 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
1c640 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69  le. Store this i
1c650 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66  n nPage. */.  if
1c660 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1c670 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61  Valid ){.    nPa
1c680 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ge = pPager->dbS
1c690 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
1c6a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
1c6c0 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  or returned by O
1c6d0 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20  sFileSize() */. 
1c6e0 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1c6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c700 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  le size in bytes
1c710 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
1c720 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20  ileSize() */..  
1c730 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1c740 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
1c750 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1c760 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1c770 20 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69    sqlite3WalDbsi
1c780 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  ze(pPager->pWal,
1c790 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a   &nPage);.    }.
1c7a0 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
1c7b0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1c7c0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1c7d0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1c7e0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1c7f0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1c800 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1c810 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
1c820 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
1c830 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1c840 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29 7b 0a  er->fd, &n)) ){.
1c850 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1c860 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1c870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1c880 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1c890 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1c8a0 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
1c8b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
1c8c0 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
1c8d0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
1c8e0 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
1c8f0 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67   (Pgno)(n / pPag
1c900 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c910 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c920 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c930 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1c940 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1c950 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
1c960 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c970 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
1c980 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
1c990 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
1c9a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1c9b0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1c9c0 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1c9d0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1c9e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1c9f0 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  e .  ** configur
1ca00 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1ca10 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1ca20 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1ca30 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1ca40 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1ca50 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1ca60 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1ca70 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1ca80 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1ca90 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1caa0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
1cab0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e  tput variable an
1cac0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1cad0 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67 65 20  OK */.  *pnPage 
1cae0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1caf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1cb00 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
1cb10 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
1cb20 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
1cb30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cb40 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
1cb50 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
1cb60 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
1cb70 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
1cb80 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
1cb90 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
1cba0 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
1cbb0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
1cbc0 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
1cbd0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
1cbe0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
1cbf0 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
1cc00 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1cc10 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
1cc20 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
1cc30 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
1cc40 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
1cc50 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
1cc60 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
1cc70 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
1cc80 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
1cc90 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
1cca0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1ccb0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1ccc0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
1ccd0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
1cce0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
1ccf0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
1cd00 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
1cd10 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
1cd20 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
1cd30 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
1cd40 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
1cd50 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1cd60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1cd70 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
1cd80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1cd90 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
1cda0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1cdd0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53   */..  /* The OS
1cde0 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
1cdf0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1ce00 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
1ce10 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
1ce20 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
1ce30 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
1ce40 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
1ce50 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
1ce60 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
1ce70 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
1ce80 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
1ce90 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
1cea0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
1ceb0 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
1cec0 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
1ced0 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20  ust be unknown. 
1cee0 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74  It.  ** must not
1cef0 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
1cf00 69 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ied at this poin
1cf10 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1cf20 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1cf30 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
1cf40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
1cf50 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73  alid==0 );.  ass
1cf60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1cf70 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1cf80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f   || pPager->dbMo
1cf90 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a 20 20  dified==0 );..  
1cfa0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
1cfb0 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
1cfc0 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
1cfd0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
1cfe0 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
1cff0 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
1d000 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
1d010 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
1d020 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
1d030 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
1d040 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
1d050 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
1d060 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
1d070 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
1d080 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
1d090 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
1d0a0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  tate>=locktype).
1d0b0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
1d0c0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1d0d0 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  UNLOCK && lockty
1d0e0 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  pe==PAGER_SHARED
1d0f0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
1d100 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1d110 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f  R_RESERVED && lo
1d120 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58  cktype==PAGER_EX
1d130 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20  CLUSIVE).  );.. 
1d140 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1d150 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
1d160 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d170 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1d180 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
1d190 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1d1a0 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
1d1b0 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
1d1c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1d1d0 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
1d1e0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
1d1f0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
1d200 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  g) );.    if( rc
1d210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d220 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1d230 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  te = (u8)locktyp
1d240 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
1d250 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
1d260 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
1d270 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
1d280 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d290 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
1d2a0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1d2b0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
1d2c0 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
1d2d0 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
1d2e0 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
1d2f0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1d300 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
1d310 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
1d320 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
1d330 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
1d340 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1d350 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d360 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
1d370 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
1d380 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
1d390 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
1d3a0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
1d3b0 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
1d3c0 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
1d3d0 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
1d3e0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
1d3f0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1d400 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
1d410 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
1d420 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
1d430 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
1d440 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
1d450 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
1d460 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
1d470 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
1d480 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
1d490 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
1d4a0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
1d4b0 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
1d4c0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
1d4d0 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
1d4e0 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
1d4f0 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
1d500 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
1d510 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1d520 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
1d530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d540 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
1d550 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
1d560 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
1d570 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
1d580 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
1d590 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
1d5a0 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
1d5b0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d5c0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1d5d0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
1d5e0 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
1d5f0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
1d600 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
1d610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1d620 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
1d630 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1d640 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
1d650 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
1d660 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
1d670 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
1d680 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
1d690 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
1d6a0 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
1d6b0 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
1d6c0 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
1d6d0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
1d6e0 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
1d6f0 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
1d700 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d710 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
1d720 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
1d730 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
1d740 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
1d750 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
1d760 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
1d770 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
1d780 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
1d790 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
1d7a0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
1d7b0 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
1d7c0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
1d7d0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
1d7e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
1d7f0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
1d800 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
1d810 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
1d820 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1d830 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
1d840 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
1d850 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1d860 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
1d870 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
1d880 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
1d890 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
1d8a0 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
1d8b0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
1d8c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
1d8d0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
1d8e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1d8f0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
1d900 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
1d910 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
1d920 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1d930 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
1d940 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
1d950 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
1d960 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1d970 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
1d980 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1d990 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1d9a0 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
1d9b0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
1d9c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d9d0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
1d9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1d9f0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
1da00 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1da10 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1da20 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1da30 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1da40 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65   = nPage;.  asse
1da50 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1da60 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  aint(pPager);.}.
1da70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1da80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1da90 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1daa0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1dab0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
1dac0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
1dad0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
1dae0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
1daf0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
1db00 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
1db10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1db20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
1db30 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
1db40 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
1db50 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
1db60 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
1db70 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
1db80 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
1db90 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
1dba0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1dbb0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
1dbc0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
1dbd0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
1dbe0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
1dbf0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
1dc00 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
1dc10 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
1dc20 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1dc30 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
1dc40 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
1dc50 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
1dc60 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
1dc70 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
1dc80 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
1dc90 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
1dca0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1dcb0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
1dcc0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1dcd0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
1dce0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
1dcf0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1dd00 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1dd10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1dd20 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
1dd30 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
1dd40 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1dd50 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
1dd60 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
1dd70 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1dd80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1dd90 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1dda0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1ddb0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
1ddc0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
1ddd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dde0 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
1ddf0 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
1de00 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
1de10 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
1de20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
1de30 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
1de40 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
1de50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1de60 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
1de70 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1de80 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
1de90 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
1dea0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
1deb0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
1dec0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
1ded0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1dee0 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
1def0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
1df00 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
1df10 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1df20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
1df30 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
1df40 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
1df50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1df60 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
1df70 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
1df80 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
1df90 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
1dfa0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
1dfb0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
1dfc0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
1dfd0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
1dfe0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
1dff0 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
1e000 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
1e010 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
1e020 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
1e030 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
1e040 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
1e050 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e060 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
1e070 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
1e080 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f  ace;..  disable_
1e090 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1e0a0 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
1e0b0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
1e0c0 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  c();.  pPager->e
1e0d0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
1e0e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1e0f0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
1e100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e110 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
1e120 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
1e130 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f  .    (pPager->no
1e140 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65  Sync ? 0 : pPage
1e150 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20  r->sync_flags), 
1e160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
1e170 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b  eSize, pTmp.  );
1e180 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
1e190 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
1e1a0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1e1b0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1e1c0 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
1e1d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
1e1e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  lse{.    /* Set 
1e1f0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72  Pager.journalHdr
1e200 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62   to -1 for the b
1e210 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61  enefit of the pa
1e220 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a  ger_playback() .
1e230 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63      ** call whic
1e240 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72  h may be made fr
1e250 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55  om within pagerU
1e260 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
1e270 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a  (). If it.    **
1e280 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e   is not -1, then
1e290 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f   the unsynced po
1e2a0 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e  rtion of an open
1e2b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
1e2c0 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79  y.    ** be play
1e2d0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
1e2e0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
1e2f0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
1e300 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a  curs while.    *
1e310 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
1e320 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
1e330 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72  e may become cor
1e340 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rupt..    */.   
1e350 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1e360 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
1e370 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1e380 65 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  e = pagerSyncHot
1e390 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1e3a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1e3b0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
1e3c0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
1e3d0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
1e3e0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
1e3f0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1e400 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
1e410 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
1e420 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1e430 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
1e440 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
1e450 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
1e460 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1e470 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
1e480 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
1e490 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
1e4a0 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
1e4b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
1e4c0 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
1e4d0 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
1e4e0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
1e4f0 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
1e500 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
1e510 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
1e520 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
1e530 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1e540 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
1e550 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
1e560 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
1e570 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
1e580 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1e590 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
1e5a0 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
1e5b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
1e5c0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
1e5d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1e5e0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1e5f0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e600 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
1e610 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
1e620 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
1e630 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
1e640 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
1e650 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
1e660 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
1e670 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
1e680 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
1e690 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1e6a0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
1e6b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e6c0 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
1e6d0 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
1e6e0 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
1e6f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
1e700 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
1e710 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
1e720 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
1e730 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
1e740 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1e750 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
1e760 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
1e770 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
1e780 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1e790 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
1e7a0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1e7b0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1e7c0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
1e7d0 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
1e7e0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74  Sync flag is not
1e7f0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
1e800 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a  function is a.**
1e810 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
1e820 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
1e830 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
1e840 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
1e850 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65  de.** and the de
1e860 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1e870 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20  tics of the the 
1e880 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
1e890 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1e8a0 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
1e8b0 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
1e8c0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
1e8d0 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
1e8e0 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
1e8f0 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
1e900 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1e910 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
1e920 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
1e930 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1e940 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
1e950 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
1e960 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1e970 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
1e980 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
1e990 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
1e9a0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1e9b0 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
1e9c0 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
1e9d0 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
1e9e0 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
1e9f0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1ea00 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
1ea10 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
1ea20 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1ea30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1ea40 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
1ea50 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
1ea60 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
1ea70 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
1ea80 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
1ea90 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
1eaa0 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
1eab0 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
1eac0 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
1ead0 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
1eae0 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
1eaf0 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
1eb00 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
1eb10 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
1eb20 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
1eb30 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
1eb40 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
1eb50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
1eb60 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
1eb70 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
1eb80 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
1eb90 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
1eba0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1ebb0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
1ebc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
1ebd0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
1ebe0 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66  s never be set f
1ebf0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1ec00 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69  es, or any.** fi
1ec10 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  le operating in 
1ec20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61  no-sync mode (Pa
1ec30 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74  ger.noSync set t
1ec40 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a  o non-zero)..**.
1ec50 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1ec60 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1ec70 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
1ec80 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1ec90 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
1eca0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1ecb0 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
1ecc0 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1ecd0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
1ece0 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
1ecf0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
1ed00 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1ed10 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1ed20 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1ed30 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
1ed40 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1ed50 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1ed60 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1ed70 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1ed80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1ed90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1eda0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1edb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1edc0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  MORY ){.      in
1edd0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ee00 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
1ee10 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1ee20 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1ee30 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1ee40 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
1ee50 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1ee60 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
1ee70 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
1ee80 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1ee90 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1eea0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
1eeb0 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
1eec0 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
1eed0 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
1eee0 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
1eef0 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
1ef00 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1ef10 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
1ef20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
1ef30 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
1ef40 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1ef50 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
1ef60 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
1ef70 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
1ef80 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
1ef90 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
1efa0 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
1efb0 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
1efc0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1efd0 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
1efe0 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
1eff0 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
1f000 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
1f010 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
1f020 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
1f030 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
1f040 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
1f050 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
1f060 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
1f070 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
1f080 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
1f090 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1f0a0 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
1f0b0 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
1f0c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1f0d0 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
1f0e0 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
1f0f0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1f100 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
1f110 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
1f120 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
1f130 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
1f140 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
1f150 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
1f160 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
1f170 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
1f180 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
1f190 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
1f1a0 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
1f1b0 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
1f1c0 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
1f1d0 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
1f1e0 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
1f1f0 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
1f200 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
1f210 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1f220 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
1f230 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
1f240 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
1f250 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
1f260 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
1f270 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
1f280 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
1f290 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
1f2a0 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
1f2b0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
1f2c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
1f2d0 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
1f2e0 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
1f2f0 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
1f300 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
1f310 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
1f320 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1f330 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
1f340 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
1f350 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
1f360 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
1f370 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
1f380 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
1f390 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
1f3a0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
1f3b0 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
1f3c0 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
1f3d0 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
1f3e0 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
1f3f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
1f400 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1f410 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
1f420 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
1f430 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
1f440 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
1f450 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1f460 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
1f470 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
1f480 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
1f490 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
1f4a0 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
1f4b0 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
1f4c0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1f4d0 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
1f4e0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
1f4f0 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
1f500 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1f510 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1f520 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f530 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1f540 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
1f550 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
1f560 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1f570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f580 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
1f590 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
1f5a0 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
1f5b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1f5c0 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
1f5d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f5e0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1f5f0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
1f600 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
1f610 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1f620 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1f630 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1f640 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1f650 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1f660 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f670 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
1f680 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1f690 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1f6a0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1f6b0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
1f6c0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
1f6d0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
1f6e0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
1f6f0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
1f700 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
1f710 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
1f720 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
1f730 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
1f740 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
1f750 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
1f760 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
1f770 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
1f780 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1f790 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1f7a0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1f7b0 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
1f7c0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
1f7d0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1f7e0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
1f7f0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
1f800 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1f810 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
1f820 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
1f830 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
1f840 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
1f850 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
1f860 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
1f870 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
1f880 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
1f890 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1f8a0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1f8b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
1f8c0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
1f8d0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
1f8e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1f8f0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1f900 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1f910 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1f920 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1f930 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1f940 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1f950 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1f960 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1f970 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f980 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1f990 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
1f9a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1f9b0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1f9c0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1f9d0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
1f9e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f9f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fa00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fa10 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
1fa20 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
1fa30 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
1fa40 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
1fa50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1fa60 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
1fa70 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
1fa80 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1fa90 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
1faa0 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
1fab0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1fac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fad0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fae0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1faf0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1fb00 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
1fb10 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
1fb20 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
1fb30 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
1fb40 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1fb50 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
1fb60 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
1fb70 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
1fb80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fb90 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1fba0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1fbb0 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  flags| .        
1fbc0 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f    (pPager->sync_
1fbd0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  flags==SQLITE_SY
1fbe0 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
1fbf0 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
1fc00 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1fc10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fc20 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1fc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fc40 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  .    /* The jour
1fc50 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
1fc60 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  t successfully s
1fc70 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72  ynced. Set Pager
1fc80 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
1fc90 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c  * to zero and cl
1fca0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
1fcb0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
1fcc0 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20  all pagess..    
1fcd0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
1fce0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1fcf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fd00 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
1fd10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fd20 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
1fd30 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73 71  urnalOff;.    sq
1fd40 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
1fd50 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
1fd60 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
1fd70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fd80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1fd90 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1fda0 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
1fdb0 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
1fdc0 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
1fdd0 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
1fde0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
1fdf0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1fe00 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
1fe10 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
1fe20 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
1fe30 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
1fe40 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1fe50 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
1fe60 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
1fe70 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
1fe80 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
1fe90 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1fea0 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
1feb0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
1fec0 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
1fed0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
1fee0 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
1fef0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
1ff00 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
1ff10 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
1ff20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1ff30 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
1ff40 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
1ff50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1ff60 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
1ff70 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
1ff80 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
1ff90 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
1ffa0 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
1ffb0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1ffc0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
1ffd0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
1ffe0 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
1fff0 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
20000 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
20010 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
20020 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
20030 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
20040 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
20050 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
20060 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
20070 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
20080 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
20090 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
200a0 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
200b0 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
200c0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
200d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
200e0 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
200f0 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
20100 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
20110 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
20120 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
20130 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
20140 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
20150 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
20160 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
20170 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
20180 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
20190 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
201a0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
201b0 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
201c0 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
201d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
201e0 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
201f0 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
20200 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
20210 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
20220 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
20230 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
20240 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
20250 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
20260 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
20270 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
20280 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
20290 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
202a0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
202b0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
202c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
202d0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
202e0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
202f0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
20300 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
20310 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
20320 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
20330 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
20340 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
20350 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
20360 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
20370 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
20380 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
20390 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
203c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ct */.  int rc; 
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
203f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
20400 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73    if( NEVER(pLis
20410 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53  t==0) ) return S
20420 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
20430 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
20440 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
20450 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
20460 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
20470 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
20480 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
20490 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
204a0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
204b0 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
204c0 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
204d0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
204e0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
204f0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
20500 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
20510 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
20520 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
20530 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
20540 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
20550 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
20560 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
20570 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
20580 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
20590 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
205a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
205b0 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
205c0 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
205d0 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
205e0 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
205f0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
20600 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
20610 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
20620 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
20630 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
20640 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
20650 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
20660 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
20670 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
20680 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
20690 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
206a0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
206b0 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
206c0 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
206d0 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
206e0 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
206f0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
20700 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
20710 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
20720 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
20730 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
20740 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
20750 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
20760 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
20770 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
20780 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
20790 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
207a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
207b0 61 67 65 72 55 73 65 57 61 6c 28 70 4c 69 73 74  agerUseWal(pList
207c0 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  ->pPager) );.  a
207d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
207e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
207f0 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70  RVED );.  rc = p
20800 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
20810 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
20820 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a  IVE_LOCK);..  /*
20830 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
20840 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
20850 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
20860 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
20870 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
20880 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
20890 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
208a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
208b0 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
208c0 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
208d0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
208e0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
208f0 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
20900 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
20910 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
20920 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20930 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
20940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
20950 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
20960 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
20970 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
20980 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
20990 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
209a0 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
209b0 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
209c0 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
209d0 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
209e0 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
209f0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
20a00 3e 64 62 53 69 7a 65 20 3e 20 28 70 50 61 67 65  >dbSize > (pPage
20a10 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2b 31 29  r->dbOrigSize+1)
20a20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
20a30 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 73 71  r->fd) ){.    sq
20a40 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
20a50 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
20a60 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
20a70 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
20a80 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
20a90 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
20aa0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
20ab0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
20ac0 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
20ad0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
20ae0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
20af0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
20b00 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
20b10 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
20b20 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
20b30 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
20b40 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
20b50 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
20b60 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
20b70 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
20b80 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
20b90 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
20ba0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
20bb0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
20bc0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
20bd0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
20be0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
20bf0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
20c00 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
20c10 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
20c20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
20c30 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
20c40 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
20c50 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
20c60 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
20c70 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
20c80 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
20c90 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
20ca0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
20cb0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
20cc0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
20cd0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
20ce0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
20cf0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
20d00 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
20d10 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
20d20 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
20d30 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
20d40 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
20d70 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
20d80 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
20d90 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
20da0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
20db0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
20dc0 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
20dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20de0 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  M, pData);..    
20df0 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
20e00 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
20e10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20e20 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
20e30 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
20e40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
20e50 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
20e60 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
20e70 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
20e80 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
20e90 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
20ea0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
20eb0 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
20ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20ed0 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
20ee0 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
20ef0 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
20f00 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
20f10 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
20f20 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
20f30 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
20f40 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
20f50 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
20f60 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
20f70 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
20f80 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
20f90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
20fa0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
20fb0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
20fc0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
20fd0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
20fe0 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
20ff0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
21000 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
21010 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
21020 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
21030 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
21040 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
21050 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
21060 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
21070 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
21080 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
21090 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
210a0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
210d0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
210e0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
210f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
21100 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
21110 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
21120 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
21130 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
21140 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
21150 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
21160 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
21170 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
21180 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
21190 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
211a0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
211b0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
211c0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
211d0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
211e0 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
211f0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
21200 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
21210 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
21220 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
21230 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
21240 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
21250 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
21260 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
21270 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
21280 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
21290 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
212a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
212b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
212c0 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
212d0 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
212e0 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
212f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
21300 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
21310 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
21320 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
21330 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
21340 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
21350 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
21360 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21380 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
21390 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
213a0 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
213b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
213c0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
213d0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
213e0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
213f0 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
21400 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
21410 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
21420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21430 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
21440 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
21450 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
21460 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
21470 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
21480 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21490 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
214a0 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
214b0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
214c0 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
214d0 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
214e0 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
214f0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
21500 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
21510 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
21520 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
21530 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
21540 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
21550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
21560 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
21570 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
21580 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
21590 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
215a0 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
215b0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
215c0 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
215d0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
215e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
215f0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
21600 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
21610 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
21620 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
21630 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
21640 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
21650 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
21660 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
21670 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
21680 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
21690 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
216a0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
216b0 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
216c0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
216d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
216e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
216f0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
21700 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
21710 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
21720 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
21730 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21740 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
21750 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
21760 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
21770 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
21780 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
21790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
217a0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
217b0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
217c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
217d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
217e0 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
217f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21800 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
21810 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
21820 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
21830 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21840 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
21850 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
21860 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
21870 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
21880 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
21890 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
218a0 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
218b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
218c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
218d0 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
218e0 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
218f0 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
21900 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
21910 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
21920 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
21930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
21950 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
21960 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
21970 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
21980 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
21990 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
219a0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
219b0 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
219c0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
219d0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
219e0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
219f0 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
21a00 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
21a10 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
21a20 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
21a30 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21a40 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
21a50 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
21a60 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
21a70 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
21a80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
21a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21aa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
21ab0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
21ac0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
21ad0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
21ae0 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
21af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21b00 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
21b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
21b20 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
21b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21b40 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
21b50 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
21b60 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
21b70 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
21b80 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
21b90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21ba0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21bb0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
21bc0 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
21bd0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
21be0 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
21bf0 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
21c00 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
21c10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
21c20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
21c30 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
21c40 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
21c50 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
21c60 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
21c70 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
21c80 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
21c90 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
21ca0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
21cb0 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
21cc0 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
21cd0 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
21ce0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
21cf0 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
21d00 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
21d10 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
21d20 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
21d30 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
21d40 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
21d50 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
21d60 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
21d70 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
21d80 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
21d90 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
21da0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21db0 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
21dc0 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
21dd0 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
21de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
21df0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
21e00 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
21e10 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
21e20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
21e30 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
21e40 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
21e50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
21e60 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
21e70 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
21e80 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
21e90 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
21ea0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
21eb0 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
21ec0 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
21ed0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
21ee0 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
21ef0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
21f00 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
21f10 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
21f20 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
21f30 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
21f40 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
21f50 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
21f60 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
21f70 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
21f80 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
21f90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21fa0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
21fb0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
21fc0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
21fd0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
21fe0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
21ff0 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
22000 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73  cSpill flag is s
22010 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
22020 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
22030 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
22040 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
22050 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
22060 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
22070 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
22080 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
22090 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
220a0 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
220b0 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
220c0 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
220d0 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
220e0 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
220f0 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
22100 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69  pill flag inhibi
22110 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
22120 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  lling regardless
22130 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a   of whether.  **
22140 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
22150 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
22160 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  s is set during 
22170 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  a rollback..  **
22180 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
22190 73 20 61 6c 73 6f 20 69 6e 68 69 62 69 74 65 64  s also inhibited
221a0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
221b0 72 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  r state..  */.  
221c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
221d0 6f 64 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ode ) return SQL
221e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
221f0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
22200 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22210 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
22220 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
22230 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  l && (pPg->flags
22240 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
22250 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  NC)!=0 ){.    re
22260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22270 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72    }..  pPg->pDir
22280 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
22290 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
222a0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
222b0 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
222c0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
222d0 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
222e0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
222f0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a  esPage(pPg) ){ .
22300 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
22310 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20  urnalPage(pPg); 
22320 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22340 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22350 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
22360 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b  , pPg, 0, 0, 0);
22370 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
22380 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
22390 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
223a0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
223b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
223c0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
223d0 4e 43 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  NC ){.      asse
223e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  rt( !pPager->noS
223f0 79 6e 63 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ync );.      rc 
22400 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
22410 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
22420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22430 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61  & .        !(pPa
22440 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
22450 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
22460 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
22470 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33         !(sqlite3
22480 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
22490 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
224a0 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
224b0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20  _SAFE_APPEND).  
224c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
224d0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
224e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
224f0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
22500 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
22510 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
22520 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
22530 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
22540 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
22550 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
22560 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  f.    ** the dat
22570 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20  abase image, it 
22580 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77  may need to be w
22590 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
225a0 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  b-journal..    *
225b0 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
225c0 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61  e the call to pa
225d0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
225e0 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20  st() below will 
225f0 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  not.    ** actua
22600 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
22610 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
22620 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a  is case..    **.
22630 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20      ** Consider 
22640 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
22650 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
22660 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
22670 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20    BEGIN;.    ** 
22680 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
22690 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
226a0 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a  <modify page X>.
226b0 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50      **     SAVEP
226c0 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20  OINT sp;.    ** 
226d0 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
226e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
226f0 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20   pages>.    **  
22700 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73       pagerStress
22710 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20  (page X).    ** 
22720 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
22730 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sp;.    **.    *
22740 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
22750 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
22760 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
22770 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
22780 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75  ritten.    ** ou
22790 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
227a0 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
227b0 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
227c0 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
227d0 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ,.    ** followi
227e0 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  ng the "ROLLBACK
227f0 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e   TO sp" statemen
22800 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  t, reading page 
22810 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20  X will read.    
22820 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
22830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22840 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
22850 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20   copy of page X 
22860 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73  as it.    ** was
22870 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
22880 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
22890 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
228a0 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
228b0 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63  .    ** was exec
228c0 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
228d0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
228e0 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
228f0 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
22900 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
22910 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f  e .    ** sub-jo
22920 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
22930 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
22940 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
22950 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20  that it will.   
22960 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
22970 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
22980 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
22990 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
229a0 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74  s .    ** execut
229b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
229c0 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20  f( NEVER(.      
229d0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
229e0 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  && pPg->pgno>pPa
229f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73  ger->dbSize && s
22a00 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
22a10 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20  pPg).    ) ){.  
22a20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
22a30 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
22a40 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
22a50 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
22a60 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
22a70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
22a80 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
22a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22aa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22ab0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
22ac0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
22ad0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
22ae0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
22af0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
22b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
22b10 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
22b20 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
22b30 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22b40 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
22b50 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
22b60 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
22b70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
22b80 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
22b90 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  r, rc);.}.../*.*
22ba0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
22bb0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
22bc0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
22bd0 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
22be0 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
22bf0 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
22c00 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
22c10 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
22c20 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
22c30 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
22c40 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
22c50 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
22c60 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
22c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22c80 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
22c90 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
22ca0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
22cb0 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
22cc0 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
22cd0 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
22ce0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
22cf0 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
22d00 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
22d10 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
22d20 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
22d30 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
22d40 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
22d50 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
22d60 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
22d70 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
22d80 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
22d90 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
22da0 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
22db0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
22dc0 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
22dd0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
22de0 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
22df0 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
22e00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
22e10 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
22e20 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
22e30 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
22e40 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
22e50 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
22e60 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
22e70 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
22e80 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
22e90 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
22ea0 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
22eb0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
22ec0 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
22ed0 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
22ee0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
22ef0 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
22f00 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
22f10 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
22f20 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
22f30 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
22f40 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
22f50 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a  DLOCK flags..**.
22f60 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
22f70 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
22f80 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
22f90 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
22fa0 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
22fb0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
22fc0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
22fd0 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
22fe0 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
22ff0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
23000 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
23010 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
23020 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
23030 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
23040 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23050 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
23060 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
23070 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
23080 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
23090 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
230a0 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
230b0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
230c0 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
230d0 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
230e0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
230f0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
23100 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
23110 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
23120 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
23130 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
23140 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
23150 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
23160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23170 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
23180 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
23190 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
231a0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
231b0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
231c0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
231d0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
231e0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
231f0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
23200 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
23210 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
23220 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23230 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
23240 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
23250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
23260 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
23270 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
23280 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
23290 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
232a0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
232b0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
232c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
232d0 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
232e0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
232f0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
23300 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
23310 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
23320 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
23330 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
23340 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
23350 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
23360 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
23370 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
23380 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
23390 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
233a0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
233b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
233c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
233d0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
233e0 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
233f0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
23400 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
23410 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
23420 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
23430 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
23440 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
23450 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
23460 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
23470 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
23480 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
23490 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
234a0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
234b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
234c0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
234d0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
234e0 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
234f0 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
23500 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
23510 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
23520 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
23530 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
23540 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23550 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
23560 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
23570 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
23580 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
23590 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
235a0 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
235b0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
235c0 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
235d0 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
235e0 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a  EADLOCK)!=0;  /*
235f0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65   True to omit re
23600 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  ad-lock */.  int
23610 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
23620 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
23630 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
23640 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
23650 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31  r PCache */.  u1
23660 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  6 szPageDflt = S
23670 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
23680 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
23690 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
236a0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
236b0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
236c0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
236d0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
236e0 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
236f0 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
23700 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
23710 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
23720 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
23730 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
23740 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
23750 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
23760 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
23770 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
23780 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
23790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
237a0 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
237b0 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
237c0 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
237d0 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
237e0 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
237f0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
23800 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
23810 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
23820 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
23830 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
23840 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
23850 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
23860 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
23870 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
23880 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
23890 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
238a0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
238b0 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
238c0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
238d0 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
238e0 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
238f0 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
23900 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
23910 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
23920 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
23930 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
23940 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
23950 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
23960 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
23970 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
23980 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
23990 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
239a0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
239b0 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
239c0 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
239d0 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
239e0 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
239f0 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
23a00 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
23a10 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
23a20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
23a30 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
23a40 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
23a50 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
23a60 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
23a70 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
23a80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
23a90 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
23aa0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
23ab0 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20  (nPathname*2);. 
23ac0 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
23ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
23ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
23af0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
23b00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
23b10 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
23b20 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
23b30 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
23b40 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
23b50 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
23b60 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [0] = 0;.    }el
23b70 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
23b80 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
23b90 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
23ba0 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
23bb0 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
23bc0 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
23bd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23be0 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
23bf0 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
23c00 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
23c10 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
23c20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
23c30 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
23c40 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
23c50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23c60 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
23c70 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
23c80 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
23c90 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
23ca0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
23cb0 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
23cc0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
23cd0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
23ce0 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
23cf0 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
23d00 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
23d10 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
23d20 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
23d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
23d40 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
23d50 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
23d60 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
23d70 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
23d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
23d90 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
23da0 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
23db0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
23dc0 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
23dd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23de0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
23df0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23e20 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
23e30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23e40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
23e50 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
23e60 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
23e70 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
23e80 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
23e90 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
23ea0 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
23eb0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
23ec0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
23ed0 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
23ee0 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
23ef0 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
23f00 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
23f10 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f30 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
23f40 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23f50 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
23f80 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
23f90 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
23fa0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
23fb0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
23fc0 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
23fd0 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
23fe0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
23ff0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
24000 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
24010 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
24020 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
24030 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
24040 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
24050 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
24060 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
24070 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
24080 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
24090 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
240a0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
240b0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
240c0 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
240d0 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
240e0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
240f0 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
24100 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
24110 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
24120 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
24130 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
24140 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
24150 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
24160 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
24170 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
24180 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
24190 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
241a0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
241b0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
241c0 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
241d0 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
241e0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24200 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
24210 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
24220 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
24230 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
24240 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
24250 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
24260 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
24270 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
24280 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
24290 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
242a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
242b0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
242c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
242d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
242f0 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
24300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
24310 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
24320 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
24330 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
24340 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
24350 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
24360 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
24370 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
24380 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
24390 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
243a0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
243b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
243c0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
243d0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
243e0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
243f0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
24400 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
24410 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
24420 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
24430 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
24440 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
24450 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
24460 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
24470 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
24480 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
24490 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
244a0 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
244b0 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
244c0 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  me ){.    pPager
244d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
244e0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
244f0 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20  Pathname + 1);. 
24500 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
24510 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
24520 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
24530 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
24540 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
24550 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
24560 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
24570 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
24580 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
24590 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b   "-journal", 8);
245a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
245b0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30  >zFilename[0]==0
245c0 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72   ) pPager->zJour
245d0 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  nal[0] = 0;.    
245e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
245f0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
24600 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
24610 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
24620 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
24630 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
24640 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
24650 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
24660 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
24670 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
24680 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
24690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
246a0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
246b0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
246c0 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
246d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
246e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
246f0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
24700 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
24710 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f  fout);.    readO
24720 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
24730 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
24740 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
24750 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
24760 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
24770 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
24780 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
24790 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
247a0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
247b0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
247c0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
247d0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
247e0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
247f0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
24800 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
24810 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
24820 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24830 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
24840 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
24850 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
24860 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
24870 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
24880 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
24890 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
248a0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
248b0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
248c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
248d0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
248e0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
248f0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
24900 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
24910 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
24920 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
24930 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
24940 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
24950 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
24960 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
24970 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
24980 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
24990 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
249a0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
249b0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
249c0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
249d0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
249e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
249f0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
24a00 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65   (u16)pPager->se
24a10 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
24a20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
24a30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24a40 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
24a50 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
24a60 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
24a70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
24a80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
24a90 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
24aa0 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
24ab0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
24ac0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
24ad0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
24ae0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
24af0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
24b00 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
24b10 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
24b20 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
24b30 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
24b40 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
24b50 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
24b60 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
24b70 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
24b80 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
24b90 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
24ba0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
24bb0 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
24bc0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
24bd0 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
24be0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24bf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
24c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24c10 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
24c20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
24c30 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
24c40 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
24c50 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
24c60 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
24c70 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
24c80 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
24c90 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
24ca0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
24cb0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
24cc0 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
24cd0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
24ce0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
24cf0 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
24d00 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24d10 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
24d20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
24d30 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
24d40 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
24d50 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
24d60 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
24d70 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
24d80 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
24d90 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
24da0 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
24db0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
24dc0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
24dd0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
24de0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
24df0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
24e00 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
24e10 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
24e20 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
24e30 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
24e40 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
24e50 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
24e60 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
24e70 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
24e80 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
24e90 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
24ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
24ec0 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
24ed0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
24ee0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
24ef0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
24f00 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
24f10 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24f20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
24f30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
24f40 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
24f50 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
24f60 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
24f70 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
24f80 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
24f90 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
24fa0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
24fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24fc0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
24fd0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
24fe0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
24ff0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
25000 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25010 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
25020 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
25030 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
25040 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
25050 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
25060 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
25070 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
25080 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
25090 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
250a0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
250b0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
250c0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
250d0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
250e0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
250f0 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
25100 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
25110 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
25120 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
25130 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
25140 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
25150 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
25160 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
25170 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
25180 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
25190 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
251a0 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
251b0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
251c0 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c  dlock = (noReadl
251d0 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29  ock && readOnly)
251e0 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67   ?1:0;.  /* pPag
251f0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
25200 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
25210 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
25220 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
25230 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
25240 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
25250 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  lid = (u8)memDb;
25260 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
25270 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
25280 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
25290 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
252a0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
252b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
252c0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
252d0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
252e0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
252f0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
25300 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
25310 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25320 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
25330 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
25340 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
25350 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
25360 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
25370 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
25380 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
25390 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
253a0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
253b0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
253c0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
253d0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
253e0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
253f0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
25400 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
25410 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
25420 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
25430 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
25440 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
25450 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
25460 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
25470 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
25480 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
25490 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
254a0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
254b0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
254c0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
254d0 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  = 0; */.  assert
254e0 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
254f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
25500 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
25510 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
25520 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
25530 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
25540 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
25550 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
25560 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
25570 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
25580 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
25590 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
255a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
255b0 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
255c0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
255d0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
255e0 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
255f0 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
25600 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
25610 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
25620 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
25630 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
25640 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
25650 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
25660 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
25670 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
25680 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
25690 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
256a0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
256b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
256c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
256d0 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
256e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
256f0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
25700 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
25710 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
25720 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
25730 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
25740 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
25750 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
25760 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
25770 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
25780 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
25790 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
257a0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20  ->aHash)); */.. 
257b0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
257c0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
257d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
257e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
257f0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
25800 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
25810 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
25820 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
25830 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
25840 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
25850 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
25860 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
25870 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
25880 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
25890 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
258a0 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
258b0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
258c0 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
258d0 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
258e0 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
258f0 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
25900 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25910 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
25920 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
25930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
25940 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
25950 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
25960 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
25970 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
25980 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
25990 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
259a0 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
259b0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
259c0 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
259d0 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
259e0 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
259f0 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
25a00 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
25a10 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
25a20 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
25a30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25a40 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
25a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25a60 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
25a70 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
25a80 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
25a90 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
25aa0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
25ab0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
25ac0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
25ad0 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
25ae0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
25af0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
25b00 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
25b10 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
25b20 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
25b30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
25b40 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
25b50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25b60 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
25b70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
25b80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
25b90 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
25ba0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
25bb0 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
25bc0 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
25bd0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
25be0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
25bf0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25c00 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
25c10 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
25c20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
25c30 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
25c40 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
25c50 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
25c60 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
25c70 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
25c80 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
25c90 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
25ca0 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
25cb0 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
25cc0 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
25cd0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
25ce0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
25cf0 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
25d00 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
25d10 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
25d20 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
25d30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
25d40 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
25d50 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
25d60 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
25d70 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
25d80 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
25d90 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
25da0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
25db0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
25dc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
25dd0 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
25de0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
25df0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
25e00 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
25e10 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
25e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25e30 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
25e40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25e50 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
25e60 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
25e70 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
25e80 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
25e90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
25ea0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
25eb0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
25ec0 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
25ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25ee0 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
25ef0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
25f00 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
25f10 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
25f20 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
25f30 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
25f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25f50 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
25f60 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
25f70 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
25f80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25f90 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45  r->state <= PAGE
25fa0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
25fb0 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
25fc0 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
25fd0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
25fe0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
25ff0 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
26000 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
26010 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
26020 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
26030 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
26040 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
26050 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
26060 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
26070 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
26080 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
26090 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
260a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
260b0 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
260c0 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20  int locked;     
260d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
260e0 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
260f0 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
26100 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
26110 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
26120 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
26130 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
26140 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
26150 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
26160 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
26170 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
26180 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
26190 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
261a0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
261b0 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
261c0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
261d0 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
261e0 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
261f0 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
26200 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
26210 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
26220 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
26230 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
26240 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
26250 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
26260 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
26270 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
26280 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
26290 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
262a0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
262b0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
262c0 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
262d0 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
262e0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
262f0 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
26300 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
26310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
26320 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
26330 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
26340 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
26350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26360 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
26370 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20   int nPage;..   
26380 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
26390 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
263a0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
263b0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70   consists of 0 p
263c0 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ages,.      ** t
263d0 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
263e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65  ournal file. See
263f0 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
26400 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20  ent above for . 
26410 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73       ** the reas
26420 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c  oning here.  Del
26430 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65  ete the obsolete
26440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e   journal file un
26450 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52  der.      ** a R
26460 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
26470 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69  avoid race condi
26480 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f  tions and to avo
26490 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20  id violating.   
264a0 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a     ** [H33020]..
264b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
264c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
264d0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
264e0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
264f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26500 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
26510 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
26520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
26530 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
26540 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
26550 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  ( sqlite3OsLock(
26560 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
26570 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
26580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26590 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
265a0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
265b0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
265c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
265d0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
265e0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
265f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
26600 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
26610 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
26620 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
26630 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26640 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
26650 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
26660 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
26670 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
26680 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
26690 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
266a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
266b0 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
266c0 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
266d0 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
266e0 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
266f0 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
26700 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
26710 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
26720 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
26730 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
26740 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
26750 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
26760 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
26770 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
26780 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
26790 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
267a0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
267b0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
267c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
267d0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
267e0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
267f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26800 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
26810 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
26820 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
26830 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
26840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26870 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
26880 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26890 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
268a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
268b0 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
268c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
268d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
268e0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
268f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26910 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
26930 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
26940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26950 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
26960 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
26970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26980 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
26990 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
269a0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
269b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
269c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
269d0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
269e0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
269f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
26a00 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
26a10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
26a20 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
26a30 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
26a40 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
26a50 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
26a60 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
26a70 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
26a80 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
26a90 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
26aa0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
26ab0 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
26ac0 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
26ad0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
26ae0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
26af0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
26b00 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
26b10 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
26b20 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
26b30 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
26b40 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
26b50 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
26b60 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
26b70 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
26b80 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
26b90 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
26ba0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26bb0 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
26bc0 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
26bd0 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
26be0 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
26bf0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
26c00 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26c10 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
26c20 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
26c30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26c40 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
26c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
26c70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26c80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26c90 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
26ca0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
26cb0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26cc0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
26cd0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
26ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
26cf0 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
26d00 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
26d10 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
26d20 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
26d30 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
26d40 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
26d50 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
26d60 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26d70 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
26d80 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
26d90 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
26da0 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
26db0 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
26dc0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
26dd0 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
26de0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
26df0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
26e00 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
26e10 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
26e20 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
26e30 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
26e40 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
26e50 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
26e60 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
26e70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
26e80 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
26e90 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
26ea0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
26eb0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
26ec0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
26ed0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
26ee0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
26ef0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
26f00 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
26f10 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
26f20 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
26f30 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
26f40 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
26f50 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
26f60 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
26f70 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
26f80 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
26f90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26fa0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
26fb0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
26fc0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
26fd0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
26fe0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
26ff0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
27000 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
27010 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
27020 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
27030 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
27040 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
27050 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
27060 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
27070 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
27080 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
27090 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
270a0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
270b0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
270c0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
270d0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
270e0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
270f0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
27100 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
27110 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
27120 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65  the operation de
27130 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61  scribed by (2) a
27140 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65  bove is not atte
27150 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68  mpted, and if th
27160 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e  e.** pager is in
27170 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
27180 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
27190 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73  E_FULL when this
271a0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74   is called,.** t
271b0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
271c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
271d0 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72  urned. It is per
271e0 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74  mitted to read t
271f0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  he.** database w
27200 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55  hen in SQLITE_FU
27210 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  LL error state..
27220 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
27230 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
27240 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
27250 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27260 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f  ned. If an.** IO
27270 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
27280 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
27290 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
272a0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
272b0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  rnal.** file or 
272c0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
272d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
272e0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
272f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
27300 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
27310 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
27320 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
27330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27350 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
27360 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65  .  int isErrorRe
27370 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
27380 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
27390 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d   recovering from
273a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
273b0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
273c0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
273d0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
273e0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
273f0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
27400 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
27410 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
27420 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
27430 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
27440 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  he)==0 );.  if( 
27450 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70  NEVER(MEMDB && p
27460 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
27470 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  ){ return pPager
27480 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20  ->errCode; }..  
27490 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
274a0 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ase is in an err
274b0 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73  or-state, now is
274c0 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65   a chance to cle
274d0 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
274e0 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
274f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
27500 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72  ager-cache and r
27510 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79  ollback.  ** any
27520 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   hot journal in 
27530 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
27540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
27550 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
27560 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27570 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
27580 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29  ager->zJournal )
27590 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
275a0 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
275b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
275c0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
275d0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
275e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
275f0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
27600 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
27610 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
27620 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
27630 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  Pager);.  }else 
27640 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
27650 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
27660 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
27670 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
27680 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
27690 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
276a0 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
276b0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
276c0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
276d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
276e0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
276f0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
27700 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
27710 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
27720 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ock ){.      ass
27730 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61  ert( pPager->rea
27740 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70  dOnly );.      p
27750 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
27760 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
27770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
27780 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
27790 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
277a0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
277b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
277c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
277d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
277e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
277f0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
27800 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
27810 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
27820 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27830 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27840 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
27850 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
27860 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
27870 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
27880 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
27890 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
278a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
278b0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
278c0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
278d0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
278e0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
278f0 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
27900 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  et ){.      asse
27910 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27920 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
27930 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  D );.      rc = 
27940 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
27950 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
27960 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
27970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27980 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
27990 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
279a0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
279b0 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
279c0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
279d0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
279e0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
279f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27a00 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
27a10 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
27a20 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
27a30 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
27a40 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
27a50 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
27a60 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
27a70 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
27a80 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
27a90 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
27aa0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
27ab0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
27ac0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
27ad0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
27ae0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
27af0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
27b00 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
27b10 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
27b20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
27b30 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
27b40 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
27b50 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
27b60 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
27b70 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
27b80 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
27b90 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
27ba0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
27bb0 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
27bc0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
27bd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
27be0 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
27bf0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
27c00 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
27c10 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
27c20 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
27c30 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
27c40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
27c50 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
27c60 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
27c70 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
27c80 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
27c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
27ca0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
27cb0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
27cc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
27cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27ce0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
27cf0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
27d00 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
27d10 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
27d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
27d30 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
27d40 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
27d50 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
27d60 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
27d70 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
27d80 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
27d90 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
27da0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
27db0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
27dc0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
27dd0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
27de0 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
27df0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
27e00 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
27e10 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
27e20 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
27e30 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
27e40 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
27e50 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
27e60 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
27e70 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
27e80 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
27e90 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
27ea0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
27eb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
27ed0 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
27ee0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
27ef0 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
27f00 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
27f10 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
27f20 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
27f30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27f40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
27f50 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
27f60 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
27f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
27f80 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
27f90 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
27fa0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
27fb0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
27fc0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27fd0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
27fe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
27ff0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
28000 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
28010 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
28020 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
28030 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28040 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
28050 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
28060 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
28070 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28080 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
28090 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
280a0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
280b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
280c0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
280e0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
280f0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
28100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28120 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
28130 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
28140 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
28150 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
28160 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  me .            
28170 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
28180 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
28190 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
281a0 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
281b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
281c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
281d0 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
281e0 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
281f0 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20   Or, it .       
28200 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
28210 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
28220 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
28230 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
28240 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
28250 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
28260 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
28270 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
28280 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20  t exist.  */.   
28290 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
282a0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
282b0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
282c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
282d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
282e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
282f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28300 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
28310 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
28320 52 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  Reset the journa
28330 6c 20 73 74 61 74 75 73 20 66 69 65 6c 64 73 20  l status fields 
28340 74 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  to indicates tha
28350 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20  t we have no.   
28360 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a     ** rollback j
28370 6f 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74  ournal at this t
28380 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  ime. */.      pP
28390 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
283a0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
283b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
283c0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
283d0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
283e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
283f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
28400 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61  0;. .      /* Ma
28410 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
28420 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
28430 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
28440 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20  . */. .      /* 
28450 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
28460 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
28470 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
28480 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
28490 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
284a0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
284b0 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
284c0 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
284d0 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
284e0 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
284f0 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
28500 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
28510 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
28520 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
28530 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
28540 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
28550 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
28560 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
28570 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
28580 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
28590 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
285a0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
285b0 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
285c0 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
285d0 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
285e0 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
285f0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
28600 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
28610 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
28620 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28630 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
28640 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
28650 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
28660 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28680 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
28690 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
286a0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
286b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
286c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
286d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
286e0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
286f0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
28700 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
28710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28720 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
28730 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
28740 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
28750 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
28760 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
28770 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
28780 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
28790 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
287a0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
287b0 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c  ->pBackup || sql
287c0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
287d0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
287e0 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  che)>0 ){.      
287f0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
28800 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
28810 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
28820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
28830 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
28840 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
28850 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
28860 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
28870 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
28880 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
28890 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
288a0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
288b0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
288c0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
288d0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
288e0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
288f0 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
28900 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
28910 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
28920 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
28930 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
28940 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
28950 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
28960 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
28970 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
28980 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
28990 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
289a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
289b0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
289c0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
289d0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
289e0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
289f0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
28a00 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
28a10 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
28a20 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
28a30 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
28a40 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
28a50 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
28a60 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
28a70 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
28a80 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
28a90 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
28aa0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
28ab0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
28ac0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
28ad0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
28ae0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
28af0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
28b00 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  */.      int nPa
28b10 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  ge = 0;.      ch
28b20 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
28b30 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
28b40 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
28b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
28b60 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
28b70 6e 50 61 67 65 29 3b 0a 0a 20 20 20 20 20 20 69  nPage);..      i
28b80 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
28b90 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  de ){.        rc
28ba0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
28bb0 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  de;.        goto
28bc0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
28bd0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
28be0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
28bf0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
28c00 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
28c10 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
28c20 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
28c30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
28c40 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
28c50 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
28c60 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
28c70 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
28c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28c90 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
28ca0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
28cb0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
28cc0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
28cd0 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
28ce0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
28cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
28d00 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
28d10 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
28d20 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
28d30 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
28d40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
28d50 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
28d60 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28d70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
28d80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
28d90 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ode || pPager->s
28da0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
28db0 45 44 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ED );..    /* If
28dc0 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
28dd0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
28de0 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
28df0 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
28e00 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
28e10 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
28e20 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
28e30 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
28e40 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
28e50 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
28e60 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
28e70 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
28e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
28ea0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
28eb0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
28ec0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
28ed0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
28ee0 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
28ef0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
28f00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
28f20 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
28f30 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
28f40 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
28f50 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
28f60 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
28f70 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
28f80 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
28f90 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
28fa0 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
28fb0 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
28fc0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
28fd0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
28fe0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
28ff0 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
29000 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
29010 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
29020 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
29030 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
29040 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
29050 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
29060 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
29070 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
29080 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
29090 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
290a0 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
290b0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
290c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
290d0 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61  >0) .  ){.    pa
290e0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
290f0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
29100 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
29110 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
29120 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
29130 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
29140 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
29150 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
29160 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
29170 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
29180 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
29190 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
291a0 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
291b0 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
291c0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
291d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
291e0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
291f0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
29200 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
29210 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
29220 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
29230 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
29240 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
29250 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
29260 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
29270 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
29280 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
29290 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
292a0 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
292b0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
292c0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
292d0 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
292e0 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
292f0 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
29300 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
29310 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
29320 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
29330 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
29340 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
29350 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
29360 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
29370 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
29380 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
29390 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
293a0 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
293b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
293c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
293d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
293e0 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
293f0 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
29400 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
29410 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
29420 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
29430 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
29440 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
29450 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
29460 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
29470 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
29480 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
29490 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
294a0 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
294b0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
294c0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
294d0 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
294e0 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
294f0 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
29500 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
29510 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
29520 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
29530 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
29540 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
29550 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
29560 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
29570 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
29580 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
29590 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
295a0 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
295b0 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
295c0 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
295d0 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
295e0 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
295f0 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
29600 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
29610 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
29620 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
29630 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
29640 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
29650 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
29660 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
29670 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
29680 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
29690 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
296a0 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
296b0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
296c0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
296d0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
296e0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
296f0 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
29700 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
29710 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
29720 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
29730 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
29740 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
29750 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
29760 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
29770 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
29780 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
29790 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
297a0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
297b0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
297c0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
297d0 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
297e0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
297f0 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
29800 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
29810 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
29820 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
29830 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
29840 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
29850 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
29860 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
29870 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
29880 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
29890 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
298a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
298b0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
298c0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
298d0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
298e0 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
298f0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
29900 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
29910 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
29920 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
29930 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
29940 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
29950 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
29960 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
29970 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
29980 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
29990 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
299a0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
299b0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
299c0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
299d0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
299e0 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
299f0 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
29a00 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
29a10 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
29a20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
29a30 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
29a40 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
29a50 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
29a60 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
29a70 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
29a80 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
29a90 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
29aa0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
29ab0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
29ac0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
29ad0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
29ae0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
29af0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
29b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
29b10 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
29b20 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
29b30 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
29b40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29b50 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
29b60 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
29b70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
29b80 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
29b90 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
29ba0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
29bb0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
29bc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
29bd0 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
29be0 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
29bf0 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
29c00 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
29c10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
29c20 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
29c30 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
29c40 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
29c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29c60 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
29c70 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  R_UNLOCK );..  i
29c80 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
29c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29ca0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29cb0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
29cc0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
29cd0 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
29ce0 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
29cf0 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
29d00 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
29d10 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
29d20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
29d30 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
29d40 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
29d50 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
29d60 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
29d70 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
29d80 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
29d90 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
29da0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
29db0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
29dc0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
29dd0 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  , ppPage);.  }..
29de0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29df0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
29e00 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
29e10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
29e20 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
29e30 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
29e40 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
29e50 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
29e60 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
29e70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
29e80 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
29e90 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
29ea0 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
29eb0 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
29ec0 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
29ed0 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
29ee0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
29ef0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
29f00 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
29f10 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
29f20 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
29f30 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70  ==pPager || (*pp
29f40 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30  Page)->pPager==0
29f50 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50   );..  if( (*ppP
29f60 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20  age)->pPager && 
29f70 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
29f80 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
29f90 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
29fa0 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
29fb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
29fc0 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
29fd0 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
29fe0 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
29ff0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2a000 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
2a010 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
2a020 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2a030 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47  ager) );.    PAG
2a040 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
2a050 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72  nHit);.    retur
2a060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
2a070 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2a080 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
2a090 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
2a0a0 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
2a0b0 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
2a0c0 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
2a0d0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  d.  */.    int n
2a0e0 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f  Max;..    PAGER_
2a0f0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
2a100 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a  ss);.    pPg = *
2a110 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
2a120 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
2a130 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
2a140 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
2a150 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
2a160 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2a170 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
2a180 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
2a190 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
2a1a0 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
2a1b0 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
2a1c0 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
2a1d0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
2a1e0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
2a1f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2a200 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
2a210 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a220 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
2a230 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
2a240 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
2a250 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a260 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2a270 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69  r, &nMax);.    i
2a280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a290 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
2a2a0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2a2b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2a2c0 20 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28   MEMDB || nMax<(
2a2d0 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  int)pgno || noCo
2a2e0 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e  ntent || !isOpen
2a2f0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
2a300 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
2a310 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
2a320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2a330 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
2a340 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
2a350 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
2a360 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
2a370 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
2a380 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
2a390 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
2a3a0 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
2a3b0 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
2a3c0 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
2a3d0 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
2a3e0 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
2a3f0 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
2a400 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
2a410 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
2a420 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2a430 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
2a440 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
2a450 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
2a460 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
2a470 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
2a480 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
2a490 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2a4a0 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
2a4b0 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
2a4c0 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
2a4d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
2a4e0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
2a4f0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2a500 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
2a510 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
2a520 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
2a530 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
2a540 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
2a550 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2a560 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
2a570 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
2a580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
2a590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a5a0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
2a5b0 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
2a5c0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2a5d0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
2a5e0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
2a5f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2a600 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
2a610 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2a620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
2a630 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
2a640 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
2a650 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
2a660 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
2a670 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
2a680 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
2a690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a6a0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2a6b0 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
2a6c0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
2a6d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2a6e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a6f0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
2a700 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
2a710 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
2a720 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
2a730 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
2a740 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
2a750 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
2a760 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
2a770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
2a780 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2a790 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
2a7a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
2a7b0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
2a7c0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
2a7d0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
2a7e0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
2a7f0 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
2a800 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
2a810 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2a820 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
2a830 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
2a840 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
2a850 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
2a860 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
2a870 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
2a880 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2a890 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
2a8a0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
2a8b0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
2a8c0 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
2a8d0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
2a8e0 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
2a8f0 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
2a900 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2a910 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
2a920 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
2a930 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
2a940 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
2a950 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
2a960 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
2a970 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
2a980 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
2a990 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a9a0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
2a9b0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
2a9c0 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
2a9d0 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
2a9e0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
2a9f0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2aa00 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
2aa10 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
2aa20 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
2aa30 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
2aa40 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
2aa50 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
2aa60 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
2aa70 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
2aa80 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
2aa90 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
2aaa0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
2aab0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
2aac0 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
2aad0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
2aae0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
2aaf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2ab00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
2ab10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2ab20 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50  Pager->state > P
2ab30 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
2ab40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2ab50 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
2ab60 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
2ab70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
2ab80 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
2ab90 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
2aba0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
2abb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2abc0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2abd0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
2abe0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
2abf0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
2ac00 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
2ac10 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
2ac20 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
2ac30 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
2ac40 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
2ac50 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
2ac60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
2ac70 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
2ac80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2ac90 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
2aca0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
2acb0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
2acc0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2acd0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
2ace0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
2acf0 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
2ad00 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
2ad10 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2ad20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2ad30 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
2ad40 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
2ad50 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2ad60 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
2ad70 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
2ad80 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
2ad90 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
2ada0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2adb0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2adc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
2add0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
2ade0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
2adf0 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
2ae00 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
2ae10 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
2ae20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
2ae30 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
2ae40 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
2ae50 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2ae60 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
2ae70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2ae80 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
2ae90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2aea0 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
2aeb0 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
2aec0 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
2aed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
2aee0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
2aef0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
2af00 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
2af10 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
2af20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
2af30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
2af40 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
2af50 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
2af60 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
2af70 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2af80 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
2af90 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
2afa0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
2afb0 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
2afc0 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
2afd0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
2afe0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2aff0 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
2b000 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
2b010 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
2b020 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
2b030 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
2b040 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
2b050 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
2b060 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2b070 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
2b080 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
2b090 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
2b0a0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
2b0b0 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
2b0c0 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
2b0d0 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
2b0e0 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
2b0f0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
2b100 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
2b110 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2b120 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
2b130 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2b140 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2b150 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2b180 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
2b190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74    /* Size of dat
2b1c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2b1d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2b1e0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2b1f0 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
2b200 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
2b210 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
2b220 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2b230 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2b240 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
2b250 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2b260 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2b270 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2b280 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2b290 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
2b2a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b2b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
2b2c0 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
2b2d0 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
2b2e0 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
2b2f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2b300 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
2b310 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
2b320 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2b330 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
2b340 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
2b350 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
2b360 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
2b370 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2b380 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2b390 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2b3a0 3b 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ;..  testcase( p
2b3b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2b3c0 69 64 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  id==0 );.  rc = 
2b3d0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2b3e0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2b3f0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2b400 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
2b410 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b420 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
2b430 63 43 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a  cCreate(nPage);.
2b440 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
2b450 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
2b460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b470 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
2b480 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
2b490 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
2b4a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2b4b0 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  n. */.  if( !isO
2b4c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b4d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
2b4e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2b4f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b500 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
2b510 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
2b520 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2b530 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
2b540 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
2b550 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
2b560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2b570 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
2b580 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2b590 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
2b5a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2b5b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2b5c0 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  E|.        (pPag
2b5d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
2b5e0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
2b5f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2b600 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
2b610 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
2b620 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
2b630 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2b640 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  NAL).        );.
2b650 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2b660 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2b670 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  E.      rc = sql
2b680 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
2b690 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c  .          pVfs,
2b6a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2b6b0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2b6c0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
2b6d0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
2b6e0 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
2b6f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b700 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2b710 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2b720 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
2b730 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
2b740 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
2b750 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2b760 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2b770 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  fd) );.  }...  /
2b780 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
2b790 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
2b7a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2b7b0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
2b7c0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
2b7d0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
2b7e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2b7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b800 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
2b810 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
2b820 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
2b830 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ired. */.    pPa
2b840 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2b850 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
2b860 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
2b870 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
2b880 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
2b890 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
2b8a0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
2b8b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
2b8c0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
2b8d0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
2b8e0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
2b8f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2b900 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  = 0;.    rc = wr
2b910 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
2b920 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
2b930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b940 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
2b950 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
2b960 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
2b970 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
2b980 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
2b990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b9a0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
2b9b0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
2b9c0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
2b9d0 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
2b9e0 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
2b9f0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2ba00 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
2ba10 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
2ba20 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2ba30 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
2ba40 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
2ba50 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
2ba60 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
2ba70 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
2ba80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ba90 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
2baa0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
2bab0 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
2bac0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2bad0 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
2bae0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
2baf0 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
2bb00 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
2bb10 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
2bb20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
2bb30 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
2bb40 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61  in-memory file a
2bb50 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nd, the journal 
2bb60 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e  file is .** open
2bb70 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
2bb80 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46   been already. F
2bb90 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  or a temporary f
2bba0 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  ile, the opening
2bbb0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72   .** of the jour
2bbc0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
2bbd0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
2bbe0 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65   is an actual ne
2bbf0 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20  ed to .** write 
2bc00 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
2bc10 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65  TODO: Why handle
2bc20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2bc30 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a   differently?.**
2bc40 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
2bc50 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
2bc60 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61  d (or if it is a
2bc70 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68  lready open), th
2bc80 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  en a.** journal-
2bc90 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
2bca0 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  n to the start o
2bcb0 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  f it..**.** If t
2bcc0 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
2bcd0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
2bce0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
2bcf0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
2bd00 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
2bd10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
2bd20 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
2bd30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2bd40 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
2bd50 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
2bd60 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
2bd70 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
2bd80 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
2bd90 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
2bda0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
2bdb0 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
2bdc0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
2bdd0 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
2bde0 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
2bdf0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
2be00 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
2be10 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
2be20 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
2be30 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
2be40 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
2be50 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2be60 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
2be70 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
2be80 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
2be90 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
2bea0 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
2beb0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2bec0 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
2bed0 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
2bee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bef0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2bf00 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
2bf10 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67  UNLOCK );.  pPag
2bf20 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2bf30 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
2bf40 6f 72 79 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ory;..  if( pPag
2bf50 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2bf60 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
2bf70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2bf80 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
2bf90 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2bfa0 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
2bfb0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
2bfc0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
2bfd0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
2bfe0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
2bff0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
2c000 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
2c010 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
2c020 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
2c030 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
2c040 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2c050 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
2c060 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
2c070 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c080 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
2c090 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
2c0a0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
2c0b0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
2c0c0 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
2c0d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c0e0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
2c0f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
2c100 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
2c110 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2c120 53 48 41 52 45 44 3b 0a 20 20 20 20 20 20 20 20  SHARED;.        
2c130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2c150 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2c160 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2c170 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
2c180 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
2c190 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
2c1a0 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
2c1b0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
2c1c0 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
2c1d0 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
2c1e0 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
2c1f0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
2c200 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
2c210 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2c220 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
2c230 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
2c240 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
2c250 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
2c260 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
2c270 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
2c280 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
2c290 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
2c2a0 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
2c2b0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
2c2c0 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  l it..      **. 
2c2d0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
2c2e0 20 73 65 74 73 20 50 61 67 65 72 2e 73 74 61 74   sets Pager.stat
2c2f0 65 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  e to PAGER_RESER
2c300 56 45 44 20 77 68 65 6e 20 69 74 20 68 61 73 20  VED when it has 
2c310 61 6e 20 6f 70 65 6e 0a 20 20 20 20 20 20 2a 2a  an open.      **
2c320 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
2c330 74 20 6e 65 76 65 72 20 74 6f 20 50 41 47 45 52  t never to PAGER
2c340 5f 45 58 43 4c 55 53 49 56 45 2e 20 54 68 69 73  _EXCLUSIVE. This
2c350 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
2c360 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
2c370 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 20 74  XCLUSIVE state t
2c380 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20  he code to roll 
2c390 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 74  back savepoint t
2c3a0 72 61 6e 73 61 63 74 69 6f 6e 73 0a 20 20 20 20  ransactions.    
2c3b0 20 20 2a 2a 20 6d 61 79 20 63 6f 70 79 20 64 61    ** may copy da
2c3c0 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
2c3d0 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
2c3e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2c3f0 73 20 77 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  s well.      ** 
2c400 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  as into the page
2c410 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f   cache. Which wo
2c420 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74  uld be incorrect
2c430 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   in WAL mode..  
2c440 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2c450 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
2c460 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2c470 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
2c480 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2c490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c4a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
2c4b0 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
2c4c0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  >dbSize;.       
2c4d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2c4e0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
2c4f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2c500 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
2c510 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c520 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2c530 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
2c540 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
2c550 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
2c560 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2c570 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
2c580 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
2c590 41 52 45 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73  ARED );.    }els
2c5a0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
2c5b0 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
2c5c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2c5d0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
2c5e0 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
2c5f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
2c600 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
2c610 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
2c620 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
2c630 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
2c640 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
2c650 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
2c660 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
2c670 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
2c680 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
2c690 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
2c6a0 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
2c6b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
2c6c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2c6d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
2c6e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
2c6f0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
2c700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c720 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2c730 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
2c740 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
2c750 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
2c760 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2c770 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2c780 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2c790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c7a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2c7b0 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e   No need to open
2c7c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c7d0 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
2c7e0 20 49 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   It will be.    
2c7f0 2a 2a 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  ** opened before
2c800 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
2c810 6f 2e 20 20 49 66 20 77 65 20 64 65 66 65 72 20  o.  If we defer 
2c820 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
2c830 6e 61 6c 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d  nal,.    ** we m
2c840 69 67 68 74 20 73 61 76 65 20 74 68 65 20 77 6f  ight save the wo
2c850 72 6b 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61  rk of creating a
2c860 20 66 69 6c 65 20 69 66 20 74 68 65 20 74 72 61   file if the tra
2c870 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
2c880 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 61 20  ends up being a 
2c890 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 0a 20  no-op..    */.. 
2c8a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c8b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2c8c0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64  sert( !pPager->d
2c8d0 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20  bModified );.   
2c8e0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79     /* Ignore any
2c8f0 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f   IO error that o
2c900 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61 67  ccurs within pag
2c910 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2c920 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 20 20  on(). The.      
2c930 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  ** purpose of th
2c940 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65  is call is to re
2c950 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
2c960 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
2c970 67 65 72 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ger.      ** sub
2c980 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73  -system. It does
2c990 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74 68  n't matter if th
2c9a0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
2c9b0 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20  s not properly. 
2c9c0 20 20 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65       ** finalize
2c9d0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  d at this point 
2c9e0 28 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74  (since it is not
2c9f0 20 61 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   a valid journal
2ca00 20 66 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20   file anyway).. 
2ca10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61       */.      pa
2ca20 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2ca30 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
2ca40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 50 41 47      }.  }..  PAG
2ca50 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
2ca60 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
2ca70 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2ca80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ca90 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
2caa0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
2cab0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
2cac0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
2cad0 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
2cae0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
2caf0 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
2cb00 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
2cb10 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
2cb20 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
2cb30 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
2cb40 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
2cb50 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
2cb60 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
2cb70 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
2cb80 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2cb90 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
2cba0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
2cbb0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
2cbc0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
2cbd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2cbe0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
2cbf0 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
2cc00 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2cc10 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
2cc20 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2cc30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cc40 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
2cc50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
2cc60 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
2cc70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  a transaction ha
2cc80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
2cc90 20 2a 2a 20 73 74 61 72 74 65 64 2e 0a 20 20 2a   ** started..  *
2cca0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2ccb0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2ccc0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20  _RESERVED );..  
2ccd0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  /* If an error h
2cce0 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  as been previous
2ccf0 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70  ly detected, rep
2cd00 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72  ort the same err
2cd10 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20  or.  ** again.. 
2cd20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2cd30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2cd40 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65   )  return pPage
2cd50 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
2cd60 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  * Higher-level r
2cd70 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61  outines never ca
2cd80 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
2cd90 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
2cda0 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c  not.  ** writabl
2cdb0 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e  e.  But check an
2cdc0 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72  yway, just for r
2cdd0 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
2cde0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2cdf0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65  ->readOnly) ) re
2ce00 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2ce10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
2ce20 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
2ce30 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
2ce40 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  (pPg);..  /* Mar
2ce50 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
2ce60 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
2ce70 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
2ce80 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
2ce90 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
2cea0 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
2ceb0 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
2cec0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
2ced0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
2cee0 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f  ;.  if( pageInJo
2cef0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73  urnal(pPg) && !s
2cf00 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
2cf10 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65  pPg) ){.    asse
2cf20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
2cf30 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2cf40 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2cf50 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
2cf60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
2cf70 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
2cf80 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
2cf90 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
2cfa0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
2cfb0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
2cfc0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
2cfd0 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
2cfe0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
2cff0 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
2d000 2a 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  * Higher level r
2d010 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68  outines should h
2d020 61 76 65 20 61 6c 72 65 61 64 79 20 73 74 61 72  ave already star
2d030 74 65 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ted a transactio
2d040 6e 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  n,.    ** which 
2d050 6d 65 61 6e 73 20 74 68 65 79 20 68 61 76 65 20  means they have 
2d060 61 63 71 75 69 72 65 64 20 74 68 65 20 6e 65 63  acquired the nec
2d070 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 62 75 74  essary locks but
2d080 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   the rollback.  
2d090 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67    ** journal mig
2d0a0 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70  ht not yet be op
2d0b0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
2d0c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2d0d0 74 61 74 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  tate>=RESERVED_L
2d0e0 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  OCK );.    if( p
2d0f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2d100 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 50 61  l==0.     && pPa
2d110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2d120 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2d130 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26  ODE_OFF .     &&
2d140 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2d150 61 67 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20  ager).    ){.   
2d160 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d170 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2d180 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2d190 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
2d1a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
2d1b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d1c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d1d0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
2d1e0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
2d1f0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
2d200 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
2d210 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
2d220 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
2d230 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
2d240 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2d250 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
2d260 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
2d270 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2d280 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
2d290 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2d2a0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
2d2b0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
2d2c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2d2d0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2d2e0 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  g) && isOpen(pPa
2d2f0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2d300 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
2d310 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2d320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
2d330 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
2d340 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
2d350 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
2d360 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
2d370 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20  Data2;..        
2d380 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
2d390 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
2d3a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
2d3b0 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
2d3c0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
2d3d0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
2d3e0 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
2d3f0 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
2d400 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
2d410 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
2d420 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d430 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
2d440 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2d450 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
2d460 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
2d470 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
2d480 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
2d490 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
2d4a0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2d4b0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2d4c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d4d0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2d4e0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
2d4f0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
2d500 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
2d510 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2d520 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
2d530 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
2d540 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
2d550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d570 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d580 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2d590 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
2d5a0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2d5b0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
2d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2d5e0 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
2d5f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2d600 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
2d610 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
2d620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d650 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2d660 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
2d670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d680 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
2d690 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2d6a0 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
2d6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d6c0 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
2d6d0 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
2d6e0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2d6f0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
2d700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2d710 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
2d720 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
2d730 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2d740 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2d750 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
2d760 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2d770 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
2d780 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
2d790 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
2d7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
2d7b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2d7c0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
2d7d0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
2d7e0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2d7f0 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
2d800 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
2d810 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
2d820 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
2d830 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
2d840 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f  ccurred while jo
2d850 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
2d860 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2d870 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
2d880 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
2d890 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
2d8a0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
2d8b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
2d8c0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2d8d0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
2d8e0 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
2d8f0 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
2d900 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
2d910 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
2d920 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
2d930 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
2d940 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
2d950 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
2d960 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2d970 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
2d980 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
2d990 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
2d9a0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
2d9b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d9c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
2d9d0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
2d9e0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2d9f0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2da00 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2da10 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
2da20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2da30 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
2da40 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69  has occurred wri
2da50 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
2da60 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
2da70 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
2da80 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
2da90 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
2daa0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
2dab0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2dac0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2dad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2dae0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2daf0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
2db00 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
2db10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2db20 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2db30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
2db40 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
2db50 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
2db60 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
2db70 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
2db80 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
2db90 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2dba0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2dbb0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
2dbc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
2dbd0 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
2dbe0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2dbf0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2dc00 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
2dc10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dc20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
2dc30 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2dc40 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2dc50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2dc60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
2dc80 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
2dc90 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
2dca0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2dcb0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
2dcc0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2dcd0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2dce0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
2dcf0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2dd00 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
2dd10 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
2dd20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
2dd30 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
2dd40 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2dd50 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2dd60 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2dd70 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
2dd80 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2dd90 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
2dda0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2ddb0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
2ddc0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
2ddd0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
2dde0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
2ddf0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
2de00 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
2de10 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
2de20 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
2de30 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
2de40 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2de50 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
2de60 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
2de70 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
2de80 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
2de90 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
2dea0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
2deb0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
2dec0 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
2ded0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2dee0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
2def0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2df00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2df10 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
2df20 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
2df30 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
2df40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2df50 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
2df60 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
2df70 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
2df80 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
2df90 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
2dfa0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
2dfb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2dfc0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
2dfd0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
2dfe0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
2dff0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
2e000 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
2e010 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
2e020 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2e030 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
2e040 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
2e050 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
2e060 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
2e070 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
2e080 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
2e090 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2e0a0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2e0b0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
2e0c0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2e0d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
2e0e0 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
2e0f0 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
2e100 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
2e110 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
2e120 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2e130 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
2e140 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
2e150 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
2e160 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
2e170 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
2e180 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
2e190 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2e1a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e1b0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
2e1c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
2e1d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
2e1e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
2e1f0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2e200 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
2e210 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
2e220 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2e230 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
2e240 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
2e250 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
2e260 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e270 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
2e280 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
2e290 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2e2a0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
2e2b0 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
2e2c0 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
2e2d0 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
2e2e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
2e2f0 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
2e300 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
2e310 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
2e320 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2e330 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2e340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2e350 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
2e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e370 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
2e380 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
2e390 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
2e3a0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
2e3b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2e3c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2e3d0 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
2e3e0 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
2e3f0 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e410 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2e420 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
2e430 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
2e440 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
2e450 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
2e460 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
2e470 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
2e480 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74  SyncSpill flag t
2e490 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
2e4a0 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
2e4b0 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f  llow.    ** a jo
2e4c0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
2e4d0 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
2e4e0 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
2e4f0 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a  rnaled by.    **
2e500 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2e510 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
2e520 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
2e530 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e540 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d  >doNotSyncSpill=
2e550 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
2e560 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
2e570 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ++;..    /* This
2e580 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
2e590 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
2e5a0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
2e5b0 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
2e5c0 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
2e5d0 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
2e5e0 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
2e5f0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
2e600 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
2e610 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2e620 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
2e630 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
2e640 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
2e650 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
2e660 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
2e670 20 2b 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d 20   + 1;..    rc = 
2e680 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2e690 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
2e6a0 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
2e6b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2e6c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e6d0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
2e6e0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
2e6f0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
2e700 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
2e710 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
2e720 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
2e730 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
2e740 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
2e750 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
2e760 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 20 20  nt+1-pg1;.      
2e770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2e780 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
2e790 65 63 74 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  ector;.      }. 
2e7a0 20 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67       assert(nPag
2e7b0 65 3e 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e>0);.      asse
2e7c0 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
2e7d0 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
2e7e0 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
2e7f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ->pgno);.    }..
2e800 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2e810 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
2e820 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
2e830 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
2e840 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
2e850 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
2e860 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
2e870 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
2e880 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2e890 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
2e8a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
2e8b0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
2e8c0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
2e8d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e8e0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2e8f0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
2e900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e920 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e930 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
2e940 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2e950 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
2e960 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2e970 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
2e980 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
2e990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e9a0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
2e9b0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
2e9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e9d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2e9e0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2e9f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ea00 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2ea10 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
2ea20 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2ea30 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
2ea40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2ea50 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2ea60 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
2ea70 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
2ea80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ea90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2eaa0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2eab0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2eac0 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
2ead0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
2eae0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
2eaf0 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
2eb00 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
2eb10 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
2eb20 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
2eb30 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
2eb40 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
2eb50 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
2eb60 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
2eb70 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
2eb80 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
2eb90 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2eba0 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
2ebb0 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
2ebc0 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
2ebd0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
2ebe0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
2ebf0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
2ec00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ec10 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2ec20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ec30 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
2ec40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
2ec50 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2ec60 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  noSync==0 );.   
2ec70 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2ec80 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  nPage; ii++){.  
2ec90 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2eca0 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
2ecb0 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
2ecc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2ecd0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2ece0 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
2ecf0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2ed00 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
2ed10 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2ed20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2ed30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2ed40 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
2ed50 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
2ed60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ed70 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
2ed80 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  ll==1 );.    pPa
2ed90 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
2eda0 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ill--;.  }else{.
2edb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2edc0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
2edd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ede0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2edf0 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
2ee00 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
2ee10 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
2ee20 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
2ee30 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2ee40 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
2ee50 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2ee60 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
2ee70 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
2ee80 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2ee90 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
2eea0 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
2eeb0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2eec0 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
2eed0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
2eee0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2eef0 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
2ef00 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
2ef10 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
2ef20 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
2ef30 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
2ef40 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
2ef50 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
2ef60 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
2ef70 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
2ef80 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
2ef90 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
2efa0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2efb0 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
2efc0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
2efd0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
2efe0 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
2eff0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
2f000 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
2f010 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
2f020 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
2f030 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
2f040 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
2f050 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
2f060 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
2f070 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
2f080 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2f090 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
2f0a0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
2f0b0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
2f0c0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
2f0d0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
2f0e0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
2f0f0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
2f100 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2f110 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
2f120 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
2f130 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
2f140 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
2f150 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2f160 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
2f170 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2f180 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2f190 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
2f1a0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2f1b0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
2f1c0 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
2f1d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2f1e0 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
2f1f0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
2f200 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
2f210 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
2f220 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
2f230 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2f240 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
2f250 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2f260 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
2f270 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
2f280 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
2f290 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2f2a0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2f2b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
2f2c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2f2d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2f2e0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
2f2f0 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
2f300 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
2f310 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
2f320 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
2f330 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2f340 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
2f350 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
2f360 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
2f370 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2f380 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
2f390 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
2f3a0 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
2f3b0 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
2f3c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f3d0 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
2f3e0 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
2f3f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2f400 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
2f410 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2f420 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
2f430 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
2f440 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
2f450 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2f460 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
2f470 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
2f480 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
2f490 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
2f4a0 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
2f4b0 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
2f4c0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2f4d0 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
2f4e0 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
2f4f0 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
2f500 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
2f510 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
2f520 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
2f530 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
2f540 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
2f550 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
2f560 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
2f570 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
2f580 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
2f590 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2f5a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
2f5b0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2f5c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f5d0 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
2f5e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2f5f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65  ITE_OK;..  /* De
2f600 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
2f610 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
2f620 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
2f630 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
2f640 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2f650 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
2f660 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
2f670 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
2f680 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
2f690 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
2f6a0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
2f6b0 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
2f6c0 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
2f6d0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
2f6e0 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
2f6f0 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
2f700 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2f710 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
2f720 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2f730 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2f740 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
2f750 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2f760 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
2f770 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
2f780 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
2f790 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
2f7a0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
2f7b0 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
2f7c0 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
2f7d0 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
2f7e0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2f7f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2f800 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66  OMIC_WRITE.# def
2f810 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
2f820 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  0.  assert( isDi
2f830 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
2f840 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2f850 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
2f860 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2f870 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69  DIRECT_MODE isDi
2f880 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a  rectMode.#endif.
2f890 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f8a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2f8b0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66  RESERVED );.  if
2f8c0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
2f8d0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
2f8e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
2f8f0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
2f900 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2f910 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
2f920 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2f930 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
2f940 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
2f950 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
2f960 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   of change-count
2f970 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20  er field */..   
2f980 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2f990 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
2f9a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f9b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
2f9c0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
2f9d0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
2f9e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2f9f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2fa00 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
2fa10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2fa20 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
2fa30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
2fa40 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
2fa50 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
2fa60 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
2fa70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
2fa80 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
2fa90 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
2faa0 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
2fab0 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
2fac0 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
2fad0 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
2fae0 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
2faf0 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
2fb00 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
2fb10 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
2fb20 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
2fb30 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
2fb40 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
2fb50 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
2fb60 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
2fb70 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
2fb80 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
2fb90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2fba0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2fbb0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
2fbc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fbd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2fbe0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2fbf0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
2fc00 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
2fc10 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
2fc20 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
2fc30 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
2fc40 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
2fc50 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2fc60 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
2fc70 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
2fc80 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fc90 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2fca0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
2fcb0 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
2fcc0 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
2fcd0 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
2fce0 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
2fcf0 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20  ..99 and in.    
2fd00 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
2fd10 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
2fd20 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
2fd30 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
2fd40 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
2fd50 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
2fd60 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
2fd70 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
2fd80 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
2fd90 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20  counter);.      
2fda0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fdb0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2fdc0 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
2fdd0 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
2fde0 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
2fdf0 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
2fe00 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
2fe10 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
2fe20 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
2fe30 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
2fe40 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
2fe50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
2fe60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2fe70 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
2fe80 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
2fe90 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2fea0 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
2feb0 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
2fec0 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
2fed0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ff00 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2ff10 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
2ff20 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
2ff30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ff40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ff50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ff60 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2ff70 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
2ff80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ff90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
2ffa0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2ffb0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2ffc0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2ffd0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
2ffe0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
2fff0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
30000 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
30010 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30020 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
30030 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20  e pager file to 
30040 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
30050 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
30060 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20  ory files.** or 
30070 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
30080 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
30090 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
300a0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61  uccessful, or ca
300b0 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20  lled on a pager 
300c0 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20  for which it is 
300d0 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a  a no-op, this.**
300e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
300f0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  s SQLITE_OK. Oth
30100 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72  erwise, an IO er
30110 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
30120 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
30130 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61  ite3PagerSync(Pa
30140 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30150 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30170 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30180 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
30190 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
301a0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
301b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
301c0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
301d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
301e0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
301f0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
30200 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
30210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30220 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
30230 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
30240 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
30250 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
30260 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
30270 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
30280 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
30290 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
302a0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
302b0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
302c0 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
302d0 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
302e0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
302f0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
30300 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
30310 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
30320 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
30330 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
30340 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  that:.**.**   * 
30350 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
30360 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
30370 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
30380 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20    * the journal 
30390 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73  is synced (unles
303a0 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
303b0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
303c0 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a  is used),.**   *
303d0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
303e0 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20   are written to 
303f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30400 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  e, .**   * the d
30410 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30420 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65  truncated (if re
30430 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20  quired), and.** 
30440 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
30450 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a   file synced. .*
30460 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  *.** The only th
30470 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73  ing that remains
30480 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
30490 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
304a0 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64   finalize .** (d
304b0 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20  elete, truncate 
304c0 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  or zero the firs
304d0 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a  t part of) the j
304e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
304f0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d  .** delete the m
30500 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
30510 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
30520 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
30530 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
30540 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
30550 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
30560 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
30570 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
30580 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
30590 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
305a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
305b0 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
305c0 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
305d0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
305e0 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
305f0 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
30600 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
30610 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
30620 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
30630 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
30640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
30650 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
30660 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
30670 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
30680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
30690 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
306a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
306b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
306c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306e0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
306f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
30700 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20  *zMaster,       
30710 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
30720 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ULL, the master 
30730 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
30740 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20    int noSync    
30750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30760 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
30770 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74  t the xSync on t
30780 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b  he db file */.){
30790 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
307a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
307b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
307c0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 64  e */..  /* The d
307d0 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e 65 76  bOrigSize is nev
307e0 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72 6e 61  er set if journa
307f0 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20 20  l_mode=OFF */.  
30800 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30810 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
30820 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
30830 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  FF || pPager->db
30840 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a  OrigSize==0 );..
30850 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
30860 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
30870 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
30880 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
30890 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
308a0 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
308b0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50  r->errCode;..  P
308c0 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41  AGERTRACE(("DATA
308d0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
308e0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53  %s zMaster=%s nS
308f0 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  ize=%d\n", .    
30900 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
30910 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  ame, zMaster, pP
30920 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a  ager->dbSize));.
30930 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  .  if( MEMDB && 
30940 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
30950 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ed ){.    /* If 
30960 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
30970 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
30980 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
30990 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
309a0 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
309b0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
309c0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
309d0 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
309e0 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
309f0 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
30a00 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
30a10 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
30a20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
30a30 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
30a40 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
30a50 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
30a60 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
30a70 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50  GER_SYNCED && pP
30a80 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
30a90 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65   ){.    if( page
30aa0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
30ab0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
30ac0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
30ad0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
30ae0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
30af0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
30b00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30b10 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
30b20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
30b30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
30b40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
30b50 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
30b60 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f   ? pPager->sync_
30b70 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20  flags : 0).     
30b80 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
30b90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30bb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
30bc0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
30bd0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d  PCache);.      }
30be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30bf0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
30c00 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
30c10 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
30c20 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
30c30 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
30c40 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
30c50 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
30c60 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
30c70 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
30c80 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
30c90 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
30ca0 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
30cb0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
30cc0 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
30cd0 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
30ce0 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
30cf0 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
30d00 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
30d10 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
30d20 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
30d30 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
30d40 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
30d50 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
30d60 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
30d70 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
30d80 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
30d90 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
30da0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
30db0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
30dc0 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
30dd0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
30de0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
30df0 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
30e00 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
30e10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
30e20 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
30e30 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
30e40 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
30e50 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
30e60 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30e70 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30e80 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30e90 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
30ea0 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
30eb0 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
30ec0 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
30ed0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
30ee0 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
30ef0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
30f00 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
30f10 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
30f20 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
30f30 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
30f40 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
30f50 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
30f60 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
30f70 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
30f80 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
30f90 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30fa0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30fb0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
30fc0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
30fd0 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
30fe0 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
30ff0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
31000 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
31010 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
31020 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
31030 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
31040 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
31050 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
31060 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
31070 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
31080 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
31090 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
310a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
310b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
310c0 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
310d0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
310e0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
310f0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
31100 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
31110 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
31120 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
31130 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31140 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31150 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
31160 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
31170 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
31180 46 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  F );.      if( !
31190 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65  zMaster && isOpe
311a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
311b0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
311c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
311d0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
311e0 67 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  ger) .       && 
311f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
31200 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
31210 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d  ze.       && (0=
31220 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
31230 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
31240 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
31250 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
31260 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ty).      ){.   
31270 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
31280 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
31290 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
312a0 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
312b0 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
312c0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
312d0 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
312e0 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
312f0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
31300 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
31310 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
31320 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
31330 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
31340 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
31350 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72   .        ** dir
31360 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
31370 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61  abase file. Beca
31380 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
31390 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20  c-write .       
313a0 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20   ** property of 
313b0 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
313c0 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61  stem, this is sa
313d0 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  fe..        */. 
313e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
313f0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
31400 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
31410 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31420 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31430 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
31440 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
31450 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31470 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31480 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
31490 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
314a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
314b0 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72  .  #else.      r
314c0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
314d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
314e0 67 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ger, 0);.  #endi
314f0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  f.      if( rc!=
31500 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31510 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31520 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
31530 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
31540 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
31550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
31560 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
31570 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62  pages.      ** b
31580 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
31590 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
315a0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
315b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
315c0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54        ** file. T
315d0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
315e0 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
315f0 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  um mode..      *
31600 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
31610 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
31620 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
31630 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
31640 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31650 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
31660 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
31670 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
31680 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
31690 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
316a0 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
316b0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
316c0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
316d0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73  e.      ** calls
316e0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
316f0 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
31700 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
31710 64 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72  d of .      ** r
31720 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
31730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31740 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
31750 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e     ** When journ
31760 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65  al_mode==OFF the
31770 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61   dbOrigSize is a
31780 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74  lways zero, so t
31790 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  his.      ** blo
317a0 63 6b 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66  ck never runs if
317b0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
317c0 46 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  F..      */.  #i
317d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
317e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
317f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
31800 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
31810 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20  OrigSize .      
31820 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65   && ALWAYS(pPage
31830 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
31840 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31850 45 5f 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a  E_OFF).      ){.
31860 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20          Pgno i; 
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31890 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
318a0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
318b0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
318c0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
318d0 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
318e0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
318f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
31900 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20  t Pgno dbSize = 
31910 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20  pPager->dbSize; 
31920 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
31930 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20  e image size */ 
31940 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
31950 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
31960 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
31970 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
31980 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
31990 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
319a0 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
319b0 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
319c0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
319d0 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
319e0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
319f0 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
31a00 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
31a10 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75    /* Page to jou
31a20 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  rnal */.        
31a30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31a40 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
31a50 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
31a60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31a80 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31a90 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
31aa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31ab0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
31ac0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
31ad0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
31ae0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
31af0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31b00 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
31b10 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31b20 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
31b30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31b40 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
31b50 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
31b60 20 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20     } .  #endif. 
31b70 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65   .      /* Write
31b80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
31b90 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
31ba0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
31bb0 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20  If a master .   
31bc0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
31bd0 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
31be0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
31bf0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
31c00 66 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20  file, .      ** 
31c10 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
31c20 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
31c30 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
31c40 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
31c50 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  o-op..      */. 
31c60 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
31c70 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
31c80 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
31c90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31ca0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31cb0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31cc0 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
31cd0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
31ce0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
31cf0 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
31d00 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
31d10 6e 67 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  ng.      ** used
31d20 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c  , this call will
31d30 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20   not create the 
31d40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
31d50 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20  perform any.    
31d60 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20    ** real IO..  
31d70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31d80 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
31d90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
31da0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31db0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31dc0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
31dd0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61        /* Write a
31de0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
31df0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31e00 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ile. */.      rc
31e10 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
31e20 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50  agelist(sqlite3P
31e30 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
31e40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
31e50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31e70 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
31e80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
31e90 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OCKED );.       
31ea0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31eb0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31ec0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
31ed0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
31ee0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
31ef0 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
31f00 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
31f10 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
31f20 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
31f30 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
31f40 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
31f50 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
31f60 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
31f70 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
31f80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31f90 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
31fa0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
31fb0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
31fc0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
31fd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
31fe0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
31ff0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
32000 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
32010 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32020 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
32030 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
32040 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
32050 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e  ncate(pPager, nN
32060 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
32070 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32080 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
32090 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
320a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
320b0 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74   Finally, sync t
320c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
320d0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  . */.      if( !
320e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
320f0 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
32100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32110 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
32120 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
32130 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  _flags);.      }
32140 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
32150 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
32160 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20  Pager)).    }.. 
32170 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
32180 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
32190 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61  .  }..commit_pha
321a0 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72  se_one_exit:.  r
321b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
321c0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
321d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
321e0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
321f0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
32200 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
32210 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
32220 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
32230 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
32240 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
32250 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
32260 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
32270 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
32280 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
32290 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
322a0 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
322b0 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
322c0 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
322d0 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
322e0 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
322f0 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
32300 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
32310 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
32320 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32330 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
32340 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
32350 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
32360 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
32370 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
32380 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
32390 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
323a0 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
323b0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
323c0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
323d0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
323e0 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
323f0 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
32400 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
32410 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
32420 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
32430 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
32440 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
32450 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
32460 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
32470 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
32480 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
32490 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
324a0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
324b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
324c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
324d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
324e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
324f0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
32500 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
32510 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
32520 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
32530 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
32540 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
32550 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
32560 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
32570 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
32580 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
32590 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
325a0 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
325b0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
325c0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
325d0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
325e0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
325f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
32600 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
32610 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
32620 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61  called if the pa
32630 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74  ger is not in at
32640 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45   least.  ** PAGE
32650 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
32660 2e 20 2a 2a 46 49 58 4d 45 2a 2a 3a 20 4d 61 6b  . **FIXME**: Mak
32670 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 69  e it so that thi
32680 73 20 74 65 73 74 20 61 6c 77 61 79 73 0a 20 20  s test always.  
32690 2a 2a 20 66 61 69 6c 73 20 2d 20 6d 61 6b 65 20  ** fails - make 
326a0 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 6e 65  it so that we ne
326b0 76 65 72 20 72 65 61 63 68 20 74 68 69 73 20 70  ver reach this p
326c0 6f 69 6e 74 20 69 66 20 77 65 20 64 6f 20 6e 6f  oint if we do no
326d0 74 20 68 6f 6c 64 0a 20 20 2a 2a 20 61 6c 6c 20  t hold.  ** all 
326e0 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 2e  necessary locks.
326f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
32700 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  R(pPager->state<
32710 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20  PAGER_RESERVED) 
32720 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
32730 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20  ERROR;..  /* An 
32740 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
32750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
32760 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
32770 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
32780 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
32790 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
327a0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
327b0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
327c0 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
327d0 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
327e0 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
327f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
32800 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
32810 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
32820 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
32830 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
32840 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
32850 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
32860 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
32870 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
32880 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
32890 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
328a0 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
328b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
328c0 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
328d0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
328e0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
328f0 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
32900 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
32910 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
32920 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
32930 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
32940 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
32950 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
32960 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
32970 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
32980 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
32990 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
329a0 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
329b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
329c0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
329d0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
329e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
329f0 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
32a00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
32a10 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
32a20 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
32a30 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
32a40 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 72  rnalOff );.    r
32a50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32a60 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
32a70 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE(("COMMIT %d\n
32a80 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
32a90 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
32aa0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
32ab0 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d  AGER_SYNCED || M
32ac0 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d  EMDB || !pPager-
32ad0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
32ae0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
32af0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
32b00 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
32b10 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
32b20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
32b30 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
32b40 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
32b50 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74  changes. The dat
32b60 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
32b70 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
32b80 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   mode..**.** Thi
32b90 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
32ba0 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a  rms two tasks:.*
32bb0 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c  *.**   1) It rol
32bc0 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  ls back the jour
32bd0 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72  nal file, restor
32be0 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ing all database
32bf0 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20   file and .**   
32c00 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63     in-memory cac
32c10 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  he pages to the 
32c20 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20  state they were 
32c30 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  in when the tran
32c40 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  saction.**      
32c50 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a  was opened, and.
32c60 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c  **   2) It final
32c70 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
32c80 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69   file, so that i
32c90 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f  t is not used fo
32ca0 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f  r hot.**      ro
32cb0 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f  llback at any po
32cc0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
32cd0 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74  e..**.** subject
32ce0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
32cf0 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73  g qualifications
32d00 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  :.**.** * If the
32d10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
32d20 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68   not yet open wh
32d30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
32d40 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
32d50 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69   then only (2) i
32d60 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20  s performed. In 
32d70 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
32d80 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  is no journal fi
32d90 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20  le.**   to roll 
32da0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  back..**.** * If
32db0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
32dc0 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
32dd0 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20  LITE_FULL, then 
32de0 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20  task (1) is .** 
32df0 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20    performed. If 
32e00 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b  successful, task
32e10 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73   (2). Regardless
32e20 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a   of the outcome.
32e30 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20  **   of either, 
32e40 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
32e50 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
32e60 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
32e70 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ller.**   (i.e. 
32e80 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
32e90 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  ERR or SQLITE_CO
32ea0 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20  RRUPT)..**.** * 
32eb0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
32ec0 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  in PAGER_RESERVE
32ed0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  D state, then at
32ee0 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68  tempt (1). Wheth
32ef0 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28  er.**   or not (
32f00 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  1) is successful
32f10 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28  , also attempt (
32f20 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  2). If successfu
32f30 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53  l, return.**   S
32f40 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
32f50 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65  ise, enter the e
32f60 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
32f70 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
32f80 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65  .**   error code
32f90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a   encountered. .*
32fa0 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
32fb0 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
32fc0 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
32fd0 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72 69  database was wri
32fe0 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53  tten to. .**   S
32ff0 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e  o is safe to fin
33000 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
33010 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74  l file even if t
33020 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20  he playback .** 
33030 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20    (operation 1) 
33040 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20  failed. However 
33050 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 65  the pager must e
33060 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
33070 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65  tate.**   as the
33080 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
33090 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
330a0 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74   are now suspect
330b0 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c  ..**.** * Finall
330c0 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45  y, if in PAGER_E
330d0 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
330e0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
330f0 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65  . Only.**   atte
33100 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20 69  mpt (2) if (1) i
33110 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65  s successful. Re
33120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
33130 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
33140 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74     otherwise ent
33150 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
33160 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
33170 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  e error code fro
33180 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c  m the .**   fail
33190 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ing operation..*
331a0 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
331b0 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ase the database
331c0 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62   file may have b
331d0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  een written to. 
331e0 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70  So if the.**   p
331f0 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  layback operatio
33200 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65  n did not succee
33210 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  d it would not b
33220 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69  e safe to finali
33230 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72  ze.**   the jour
33240 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65  nal file. It nee
33250 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e  ds to be left in
33260 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
33270 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f   so that.**   so
33280 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
33290 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72   can use it to r
332a0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
332b0 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a  ase state (by.**
332c0 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72     hot-journal r
332d0 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74  ollback)..*/.int
332e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
332f0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
33300 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
33310 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
33320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33330 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
33340 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52 4f   PAGERTRACE(("RO
33350 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
33360 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
33370 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
33380 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
33390 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
333a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
333b0 72 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  rSavepoint(pPage
333c0 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  r, SAVEPOINT_ROL
333d0 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a 20 20 20 20  LBACK, -1);.    
333e0 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
333f0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
33400 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
33410 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
33420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
33430 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 72 63  rc = rc2;.    rc
33440 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
33450 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 65  Pager, rc);.  }e
33460 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
33470 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21  >dbModified || !
33480 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
33490 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  fd) ){.    rc = 
334a0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
334b0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
334c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
334d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
334e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
334f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33500 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
33510 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
33520 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
33530 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
33540 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
33550 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
33560 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  }.    rc = pPage
33570 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
33580 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
33590 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
335a0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
335b0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
335c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
335d0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
335e0 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70  );.      rc2 = p
335f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
33600 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
33610 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
33620 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33640 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
33650 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
33660 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
33670 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
33680 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
33690 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
336a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
336b0 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
336c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
336d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
336e0 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
336f0 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
33700 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
33710 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  ger.    ** cache
33720 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
33730 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
33740 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
33750 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a  ny error .    **
33760 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20   persistent..   
33770 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
33780 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
33790 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
337a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
337b0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
337c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
337d0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
337e0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
337f0 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
33800 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
33810 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
33820 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67  */.u8 sqlite3Pag
33830 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
33840 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
33850 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
33860 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
33870 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
33880 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
33890 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
338a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
338b0 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
338c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
338d0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
338e0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
338f0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
33900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33910 61 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62  approximate numb
33920 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
33930 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 0a  emory currently.
33940 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ** used by the p
33950 61 67 65 72 20 61 6e 64 20 69 74 73 20 61 73 73  ager and its ass
33960 6f 63 69 61 74 65 64 20 63 61 63 68 65 2e 0a 2a  ociated cache..*
33970 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33980 65 72 4d 65 6d 55 73 65 64 28 50 61 67 65 72 20  erMemUsed(Pager 
33990 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
339a0 70 65 72 50 61 67 65 53 69 7a 65 20 3d 20 70 50  perPageSize = pP
339b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
339c0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
339d0 2b 20 32 30 3b 0a 20 20 72 65 74 75 72 6e 20 70  + 20;.  return p
339e0 65 72 50 61 67 65 53 69 7a 65 2a 73 71 6c 69 74  erPageSize*sqlit
339f0 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
33a00 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
33a10 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20  e).           + 
33a20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
33a30 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  e(pPager);.}../*
33a40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
33a50 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
33a60 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69  ces to the speci
33a70 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e  fied page..*/.in
33a80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
33a90 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67  geRefcount(DbPag
33aa0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
33ab0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
33ac0 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
33ad0 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  age);.}..#ifdef 
33ae0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
33af0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
33b00 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
33b10 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
33b20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
33b30 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
33b40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33b50 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
33b60 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c  1];.  a[0] = sql
33b70 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
33b80 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33b90 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71  he);.  a[1] = sq
33ba0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
33bb0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
33bc0 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20  ache);.  a[2] = 
33bd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74  sqlite3PcacheGet
33be0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
33bf0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
33c00 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
33c10 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29  izeValid ? (int)
33c20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
33c30 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  : -1;.  a[4] = p
33c40 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
33c50 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
33c60 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
33c70 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
33c80 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
33c90 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
33ca0 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
33cb0 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
33cc0 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
33cd0 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
33ce0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
33cf0 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
33d00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
33d10 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
33d20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
33d30 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69  mory pager..*/.i
33d40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
33d50 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50  sMemdb(Pager *pP
33d60 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
33d70 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MEMDB;.}../*.** 
33d80 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  Check that there
33d90 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53   are at least nS
33da0 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69  avepoint savepoi
33db0 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65  nts open. If the
33dc0 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  re are.** curren
33dd0 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53  tly less than nS
33de0 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20  avepoints open, 
33df0 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72  then open one or
33e00 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
33e10 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74  .** to make up t
33e20 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49  he difference. I
33e30 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
33e40 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c  savepoints is al
33e50 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74  ready.** equal t
33e60 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68  o nSavepoint, th
33e70 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
33e80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
33e90 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
33ea0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
33eb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
33ec0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
33ed0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
33ee0 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20  s while opening 
33ef0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
33f00 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f  file, then an IO
33f10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a   error code is.*
33f20 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  * returned. Othe
33f30 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
33f40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33f50 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
33f60 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
33f70 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74  , int nSavepoint
33f80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33f90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
33fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33fb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
33fc0 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20  .  int nCurrent 
33fd0 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  = pPager->nSavep
33fe0 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  oint;        /* 
33ff0 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
34000 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  f savepoints */.
34010 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
34020 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50  t>nCurrent && pP
34030 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
34040 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   ){.    int ii; 
34050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34070 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
34080 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65  able */.    Page
34090 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77  rSavepoint *aNew
340a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
340b0 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72      /* New Pager
340c0 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
340d0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  y */.    int nPa
340e0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
340f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34100 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
34110 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
34120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34130 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
34140 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
34150 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34160 6e 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 47 72  n rc;..    /* Gr
34170 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  ow the Pager.aSa
34180 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73  vepoint array us
34190 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52  ing realloc(). R
341a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
341b0 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  EM.    ** if the
341c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
341d0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65  s. Otherwise, ze
341e0 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69  ro the new porti
341f0 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20  on in case a .  
34200 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c    ** malloc fail
34210 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
34220 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69   populating it i
34230 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c  n the for(...) l
34240 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  oop below..    *
34250 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61  /.    aNew = (Pa
34260 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73  gerSavepoint *)s
34270 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
34280 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
34290 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f  Savepoint, sizeo
342a0 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f(PagerSavepoint
342b0 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20  )*nSavepoint.   
342c0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65   );.    if( !aNe
342d0 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  w ){.      retur
342e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
342f0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
34300 28 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d  (&aNew[nCurrent]
34310 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74  , 0, (nSavepoint
34320 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20 73 69 7a  -nCurrent) * siz
34330 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69  eof(PagerSavepoi
34340 6e 74 29 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nt));.    pPager
34350 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61  ->aSavepoint = a
34360 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70  New;..    /* Pop
34370 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53  ulate the PagerS
34380 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
34390 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74  res just allocat
343a0 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ed. */.    for(i
343b0 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e  i=nCurrent; ii<n
343c0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
343d0 7b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  {.      aNew[ii]
343e0 2e 6e 4f 72 69 67 20 3d 20 6e 50 61 67 65 3b 0a  .nOrig = nPage;.
343f0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
34400 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
34410 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34420 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Off>0 ){.       
34430 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
34440 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
34450 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65  nalOff;.      }e
34460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65  lse{.        aNe
34470 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20  w[ii].iOffset = 
34480 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
34490 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
344a0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
344b0 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d  SubRec = pPager-
344c0 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20  >nSubRec;.      
344d0 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65  aNew[ii].pInSave
344e0 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  point = sqlite3B
344f0 69 74 76 65 63 43 72 65 61 74 65 28 6e 50 61 67  itvecCreate(nPag
34500 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  e);.      if( !a
34510 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
34520 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
34530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34540 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
34550 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
34560 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
34570 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
34580 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
34590 2d 3e 70 57 61 6c 2c 20 61 4e 65 77 5b 69 69 5d  ->pWal, aNew[ii]
345a0 2e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  .aWalData);.    
345b0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
345c0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 69  ->nSavepoint = i
345d0 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  i+1;.    }.    a
345e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
345f0 53 61 76 65 70 6f 69 6e 74 3d 3d 6e 53 61 76 65  Savepoint==nSave
34600 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  point );.    ass
34610 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
34620 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  raint(pPager);. 
34630 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
34640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
34650 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
34660 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  d to rollback or
34670 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
34680 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ) a savepoint..*
34690 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
346a0 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  to release or ro
346b0 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20  llback need not 
346c0 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  be the most rece
346d0 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64  ntly .** created
346e0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
346f0 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69  * Parameter op i
34700 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
34710 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
34720 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  CK or SAVEPOINT_
34730 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69  RELEASE..** If i
34740 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
34750 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c  ELEASE, then rel
34760 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79  ease and destroy
34770 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77   the savepoint w
34780 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61  ith.** index iSa
34790 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69  vepoint. If it i
347a0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
347b0 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62  BACK, then rollb
347c0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a  ack all changes.
347d0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  ** that have occ
347e0 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20  urred since the 
347f0 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
34800 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
34810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70  .**.** The savep
34820 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  oint to rollback
34830 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20 69   or release is i
34840 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
34850 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65  ameter .** iSave
34860 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f  point. A value o
34870 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65  f 0 means to ope
34880 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  rate on the oute
34890 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a  rmost savepoint.
348a0 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20 63 72  ** (the first cr
348b0 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20  eated). A value 
348c0 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  of (Pager.nSavep
348d0 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70  oint-1) means op
348e0 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  erate.** on the 
348f0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
34900 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  eated savepoint.
34910 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69   If iSavepoint i
34920 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  s greater than.*
34930 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  * (Pager.nSavepo
34940 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69  int-1), then thi
34950 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
34960 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
34970 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
34980 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
34990 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
349a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
349b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
349c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
349d0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74  s is different t
349e0 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  o calling .** sq
349f0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
34a00 63 6b 28 29 20 62 65 63 61 75 73 65 20 74 68 69  ck() because thi
34a10 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
34a20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a  not terminate.**
34a30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34a40 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   or unlock the d
34a50 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74  atabase, it just
34a60 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a   restores the .*
34a70 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
34a80 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
34a90 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
34aa0 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20  . .**.** In any 
34ab0 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f  case, all savepo
34ac0 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64  ints with an ind
34ad0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
34ae0 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61  iSavepoint .** a
34af0 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66  re destroyed. If
34b00 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61   this is a relea
34b10 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70  se operation (op
34b20 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
34b30 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61  ASE),.** then sa
34b40 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69  vepoint iSavepoi
34b50 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72  nt is also destr
34b60 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oyed..**.** This
34b70 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
34b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
34b90 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M if a memory al
34ba0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
34bb0 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  ** or an IO erro
34bc0 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20  r code if an IO 
34bd0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
34be0 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  le rolling back 
34bf0 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  a .** savepoint.
34c00 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63   If no errors oc
34c10 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
34c20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  s returned..*/ .
34c30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
34c40 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
34c50 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c  *pPager, int op,
34c60 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
34c70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
34c80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
34c90 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
34ca0 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
34cb0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
34cc0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
34cd0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
34ce0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
34cf0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66  OLLBACK );..  if
34d00 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61  ( iSavepoint<pPa
34d10 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
34d20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  ){.    int ii;  
34d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
34d40 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
34d50 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20  /.    int nNew; 
34d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
34d70 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20  er of remaining 
34d80 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72  savepoints after
34d90 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20   this op. */..  
34da0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
34db0 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69  how many savepoi
34dc0 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62  nts will still b
34dd0 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20 74  e active after t
34de0 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  his.    ** opera
34df0 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73  tion. Store this
34e00 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20   value in nNew. 
34e10 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72  Then free resour
34e20 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ces associated .
34e30 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
34e40 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
34e50 61 72 65 20 64 65 73 74 72 6f 79 65 64 20 62 79  are destroyed by
34e60 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
34e70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77  .    */.    nNew
34e80 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20   = iSavepoint + 
34e90 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  (( op==SAVEPOINT
34ea0 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a  _RELEASE ) ? 0 :
34eb0 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   1);.    for(ii=
34ec0 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d  nNew; ii<pPager-
34ed0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
34ee0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
34ef0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
34f00 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
34f10 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
34f20 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
34f30 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
34f40 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f  t = nNew;..    /
34f50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
34f60 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
34f70 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
34f80 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
34f90 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
34fa0 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  nal to zero byte
34fb0 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
34fc0 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
34fd0 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
34fe0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30       if( nNew==0
34ff0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
35000 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
35010 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e      /* Only trun
35020 63 61 74 65 20 69 66 20 69 74 20 69 73 20 61 6e  cate if it is an
35030 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
35040 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
35050 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
35060 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
35070 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
35080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35090 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
350a0 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20  ger->sjfd, 0);. 
350b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
350c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
350d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
350e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
350f0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Rec = 0;.      }
35100 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c  .    }.    /* El
35110 73 65 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  se this is a rol
35120 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
35130 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
35140 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
35150 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
35160 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
35170 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
35180 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
35190 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
351a0 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
351b0 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
351c0 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
351d0 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
351e0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
351f0 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
35200 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
35210 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
35220 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
35230 20 65 6c 73 65 20 69 66 28 20 70 61 67 65 72 55   else if( pagerU
35240 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
35250 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
35260 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61  jfd) ){.      Pa
35270 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
35280 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77  avepoint = (nNew
35290 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e  ==0)?0:&pPager->
352a0 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d  aSavepoint[nNew-
352b0 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  1];.      rc = p
352c0 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
352d0 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53  point(pPager, pS
352e0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
352f0 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49   assert(rc!=SQLI
35300 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a  TE_DONE);.    }.
35310 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20    .  }.  return 
35320 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
35330 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
35340 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
35350 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
35360 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
35370 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
35380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
35390 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
353a0 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
353b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
353c0 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f  VFS structure fo
353d0 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  r the pager..*/.
353e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66  const sqlite3_vf
353f0 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56  s *sqlite3PagerV
35400 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  fs(Pager *pPager
35410 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
35420 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a  er->pVfs;.}../*.
35430 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
35440 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
35450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35460 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
35470 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  th the pager.  T
35480 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  his might return
35490 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c   NULL if the fil
354a0 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74  e has.** not yet
354b0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f   been opened..*/
354c0 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73  .sqlite3_file *s
354d0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
354e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
354f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
35500 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >fd;.}../*.** Re
35510 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
35520 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
35530 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
35540 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
35550 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
35560 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
35570 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
35580 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
35590 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
355a0 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
355b0 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
355c0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
355d0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
355e0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
355f0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
35600 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
35610 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
35620 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
35630 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
35640 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
35650 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
35660 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20  EC./*.** Set or 
35670 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 64  retrieve the cod
35680 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
35690 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
356a0 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
356b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
356c0 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
356d0 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
356e0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
356f0 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
35700 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
35710 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
35720 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a  ecFree)(void*),.
35730 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29    void *pCodec.)
35740 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
35750 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
35760 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
35770 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
35780 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
35790 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  c = pPager->memD
357a0 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a  b ? 0 : xCodec;.
357b0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
357c0 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65  SizeChng = xCode
357d0 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61  cSizeChng;.  pPa
357e0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
357f0 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20  = xCodecFree;.  
35800 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d  pPager->pCodec =
35810 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72   pCodec;.  pager
35820 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
35830 72 29 3b 0a 7d 0a 76 6f 69 64 20 2a 73 71 6c 69  r);.}.void *sqli
35840 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63  te3PagerGetCodec
35850 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35860 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
35870 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64  ->pCodec;.}.#end
35880 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
35890 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
358a0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
358b0 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
358c0 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
358d0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
358e0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
358f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
35900 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
35910 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
35920 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
35930 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
35940 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
35950 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
35960 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
35970 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
35980 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  ly located at pg
35990 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
359a0 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
359b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
359c0 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
359d0 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
359e0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
359f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
35a00 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
35a10 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
35a20 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
35a30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
35a40 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
35a50 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
35a60 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
35a70 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
35a80 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
35a90 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
35aa0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
35ab0 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
35ac0 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
35ad0 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
35ae0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
35af0 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
35b00 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
35b10 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
35b20 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
35b30 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
35b40 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
35b50 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
35b60 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
35b70 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
35b80 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
35b90 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
35ba0 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
35bb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72  *.** If the four
35bc0 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43  th argument, isC
35bd0 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65  ommit, is non-ze
35be0 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
35bf0 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d  ge is being.** m
35c00 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oved as part of 
35c10 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67  a database reorg
35c20 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62  anization just b
35c30 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
35c40 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69  ction .** is bei
35c50 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e  ng committed. In
35c60 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
35c70 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
35c80 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  t the database p
35c90 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65  age .** pPg refe
35ca0 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62  rs to will not b
35cb0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61  e written to aga
35cc0 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
35cd0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
35ce0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35cf0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
35d00 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
35d10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
35d20 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
35d30 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  s. Otherwise, it
35d40 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
35d50 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
35d60 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
35d70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
35d80 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
35d90 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
35da0 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
35db0 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  PgOld;          
35dc0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
35dd0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
35de0 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  en. */.  Pgno ne
35df0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20  edSyncPgno = 0; 
35e00 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c        /* Old val
35e10 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c  ue of pPg->pgno,
35e20 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75   if sync is requ
35e30 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ired */.  int rc
35e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35e50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35e60 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   code */.  Pgno 
35e70 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20  origPgno;       
35e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
35e90 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d  riginal page num
35ea0 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ber */..  assert
35eb0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
35ec0 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20  ..  /* In order 
35ed0 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  to be able to ro
35ee0 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65  llback, an in-me
35ef0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d 75  mory database mu
35f00 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
35f10 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
35f20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a  moving from..  *
35f30 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
35f40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35f50 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
35f60 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
35f70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
35f80 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
35f90 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64  being moved is d
35fa0 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74  irty and has not
35fb0 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74   been saved by t
35fc0 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73  he latest.  ** s
35fd0 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73  avepoint, then s
35fe0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
35ff0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
36000 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20  page into the . 
36010 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
36020 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71  now. This is req
36030 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
36040 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
36050 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  enario:.  **.  *
36060 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
36070 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
36080 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e X, then modify
36090 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20   it in memory>. 
360a0 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
360b0 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20  T one;.  **     
360c0 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74    <Move page X t
360d0 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20  o location Y>.  
360e0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
360f0 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  TO one;.  **.  *
36100 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65  * If page X were
36110 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
36120 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
36130 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  here, it would n
36140 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69  ot.  ** be possi
36150 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69  ble to restore i
36160 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e  ts contents when
36170 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
36180 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74  O one".  ** stat
36190 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72  ement were is pr
361a0 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  ocessed..  **.  
361b0 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  ** subjournalPag
361c0 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  e() may need to 
361d0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  allocate space t
361e0 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  o store pPg->pgn
361f0 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20  o into.  ** one 
36200 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
36210 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20  t bitvecs. This 
36220 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68  is the reason th
36230 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
36240 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
36250 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20  TE_NOMEM..  */. 
36260 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
36270 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20 26  PGHDR_DIRTY.   &
36280 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
36290 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
362a0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
362b0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
362c0 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
362d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
362e0 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
362f0 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
36300 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
36310 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
36320 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
36330 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
36340 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
36350 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
36360 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
36370 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
36380 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
36390 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
363a0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
363b0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
363c0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
363d0 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
363e0 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
363f0 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
36400 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
36410 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
36420 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
36430 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
36440 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
36450 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
36460 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
36470 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
36480 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
36490 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
364a0 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
364b0 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
364c0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
364d0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
364e0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
364f0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
36500 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
36510 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
36520 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
36530 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
36540 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
36550 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
36560 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
36570 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
36580 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
36590 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  igSize );.    as
365a0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
365b0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
365c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
365d0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
365e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
365f0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
36600 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
36610 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
36620 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
36630 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
36640 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
36650 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
36660 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
36670 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
36680 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
36690 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
366a0 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
366b0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
366c0 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
366d0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
366e0 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
366f0 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
36700 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
36710 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
36720 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
36730 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
36740 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
36750 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
36760 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
36770 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
36780 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28 20  _SYNC);.    if( 
36790 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
367a0 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72 64  * Do not discard
367b0 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20 69   pages from an i
367c0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
367d0 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68 74  e since we might
367e0 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74  .      ** need t
367f0 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72  o rollback later
36800 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68 65  .  Just move the
36810 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68 65   page out of the
36820 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61   way. */.      a
36830 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
36840 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
36850 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
36860 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70 50  eMove(pPgOld, pP
36870 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b  ager->dbSize+1);
36880 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36890 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
368a0 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  rop(pPgOld);.   
368b0 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67   }.  }..  origPg
368c0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
368d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
368e0 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
368f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
36900 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
36910 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
36920 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
36930 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
36940 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
36950 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
36960 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
36970 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
36980 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
36990 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
369a0 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
369b0 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
369c0 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
369d0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
369e0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
369f0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
36a00 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
36a10 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
36a20 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
36a30 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
36a40 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
36a50 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
36a60 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
36a70 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
36a80 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
36a90 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
36aa0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
36ab0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
36ac0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
36ad0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
36ae0 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
36af0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
36b00 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
36b10 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
36b20 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
36b30 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
36b40 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
36b50 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
36b60 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
36b70 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
36b80 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
36b90 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
36ba0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
36bb0 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
36bc0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
36bd0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
36be0 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
36bf0 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
36c00 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
36c10 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
36c20 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
36c30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
36c40 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
36c50 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
36c60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
36c70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36c80 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
36c90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
36ca0 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
36cb0 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
36cc0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
36cd0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
36ce0 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
36cf0 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
36d00 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
36d10 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
36d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36d30 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
36d40 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
36d50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36d70 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
36d80 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
36d90 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
36da0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36db0 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a  pTmpSpace!=0 );.
36dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
36dd0 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
36de0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
36df0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61  eedSyncPgno, pPa
36e00 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
36e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
36e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
36e30 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
36e40 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
36e50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
36e60 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
36e70 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
36e80 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
36e90 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
36ea0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
36eb0 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
36ec0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36ed0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
36ee0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  }..  /*.  ** For
36ef0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
36f00 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72  tabase, make sur
36f10 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
36f20 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20  age continues.  
36f30 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20  ** to exist, in 
36f40 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
36f50 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f  tion needs to ro
36f60 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70 50  ll back.  Use pP
36f70 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68 65  gOld.  ** as the
36f80 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 73   original page s
36f90 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72 65  ince it has alre
36fa0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
36fb0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  ed..  */.  if( M
36fc0 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69  EMDB ){.    sqli
36fd0 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
36fe0 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b  gOld, origPgno);
36ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
37000 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a  rUnref(pPgOld);.
37010 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
37020 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
37030 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
37040 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
37050 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
37060 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
37070 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
37080 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
37090 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  e *pPg){.  asser
370a0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c  t( pPg->nRef>0 |
370b0 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d  | pPg->pPager->m
370c0 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e  emDb );.  return
370d0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a   pPg->pData;.}..
370e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
370f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
37100 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
37110 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
37120 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
37130 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
37140 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
37150 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
37160 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
37170 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
37180 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b  urn pPg->pExtra;
37190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
371a0 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
371b0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
371c0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
371d0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
371e0 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
371f0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
37200 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37210 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
37220 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37230 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
37240 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
37250 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
37260 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
37270 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
37280 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
37290 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
372a0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
372b0 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
372c0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
372d0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
372e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
372f0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
37300 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
37310 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
37320 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
37330 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37340 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
37350 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
37360 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
37370 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
37380 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
37390 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
373a0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
373b0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
373c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
373d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
373e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
373f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
37400 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37410 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
37420 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
37430 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
37440 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
37450 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
37460 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
37470 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
37480 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
37490 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
374a0 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  veMode = (u8)eMo
374b0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
374c0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
374d0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
374e0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6a 6f  /*.** Set the jo
374f0 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
37500 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
37510 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
37520 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
37530 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
37540 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  LMODE_DELETE.** 
37550 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
37560 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a  MODE_TRUNCATE.**
37570 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
37580 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a  LMODE_PERSIST.**
37590 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
375a0 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20  LMODE_OFF.**    
375b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
375c0 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 50  E_MEMORY.**    P
375d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
375e0 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  _WAL.**.** The j
375f0 6f 75 72 6e 61 6c 6d 6f 64 65 20 69 73 20 73 65  ournalmode is se
37600 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
37610 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65 20  pecified if the 
37620 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65  change is allowe
37630 64 2e 0a 2a 2a 20 54 68 65 20 63 68 61 6e 67 65  d..** The change
37640 20 6d 61 79 20 62 65 20 64 69 73 61 6c 6c 6f 77   may be disallow
37650 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f  ed for the follo
37660 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a  wing reasons:.**
37670 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d  .**   *  An in-m
37680 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 63  emory database c
37690 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69 74 73  an only have its
376a0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65   journal_mode se
376b0 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20  t to _OFF.**    
376c0 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a    or _MEMORY..**
376d0 0a 2a 2a 20 20 20 2a 20 20 54 65 6d 70 6f 72 61  .**   *  Tempora
376e0 72 79 20 64 61 74 61 62 61 73 65 73 20 63 61 6e  ry databases can
376f0 6e 6f 74 20 68 61 76 65 20 5f 57 41 4c 20 6a 6f  not have _WAL jo
37700 75 72 6e 61 6c 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  urnalmode..**.**
37710 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e   The returned in
37720 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65  dicate the curre
37730 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
37740 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  ated) journal-mo
37750 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
37760 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61  e3PagerSetJourna
37770 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
37780 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
37790 0a 20 20 75 38 20 65 4f 6c 64 20 3d 20 70 50 61  .  u8 eOld = pPa
377a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
377b0 3b 20 20 20 20 2f 2a 20 50 72 69 6f 72 20 6a 6f  ;    /* Prior jo
377c0 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f 0a 0a 20 20  urnalmode */..  
377d0 2f 2a 20 54 68 65 20 65 4d 6f 64 65 20 70 61 72  /* The eMode par
377e0 61 6d 65 74 65 72 20 69 73 20 61 6c 77 61 79 73  ameter is always
377f0 20 76 61 6c 69 64 20 2a 2f 0a 20 20 61 73 73 65   valid */.  asse
37800 72 74 28 20 20 20 20 20 20 65 4d 6f 64 65 3d 3d  rt(      eMode==
37810 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37820 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
37830 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
37840 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37850 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
37860 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
37870 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37880 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
37890 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
378a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
378b0 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
378c0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
378d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
378e0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL .            
378f0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
37900 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
37910 52 59 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  RY );..  /* Do n
37920 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75  ot allow the jou
37930 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61 20 54 45  rnalmode of a TE
37940 4d 50 20 64 61 74 61 62 61 73 65 20 74 6f 20 62  MP database to b
37950 65 20 63 68 61 6e 67 65 64 20 74 6f 20 57 41 4c  e changed to WAL
37960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37970 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
37980 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37990 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
379a0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 6c 64      assert( eOld
379b0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
379c0 4f 44 45 5f 57 41 4c 20 29 3b 0a 20 20 20 20 65  ODE_WAL );.    e
379d0 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d  Mode = eOld;.  }
379e0 0a 0a 20 20 2f 2a 20 44 6f 20 61 6c 6c 6f 77 20  ..  /* Do allow 
379f0 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20  the journalmode 
37a00 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  of an in-memory 
37a10 64 61 74 61 62 61 73 65 20 74 6f 20 62 65 20 73  database to be s
37a20 65 74 20 74 6f 0a 20 20 2a 2a 20 61 6e 79 74 68  et to.  ** anyth
37a30 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 4d  ing other than M
37a40 45 4d 4f 52 59 20 6f 72 20 4f 46 46 0a 20 20 2a  EMORY or OFF.  *
37a50 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
37a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 6c  .    assert( eOl
37a70 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  d==PAGER_JOURNAL
37a80 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 65  MODE_MEMORY || e
37a90 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  Old==PAGER_JOURN
37aa0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
37ab0 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 50 41 47    if( eMode!=PAG
37ac0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
37ad0 45 4d 4f 52 59 20 26 26 20 65 4d 6f 64 65 21 3d  EMORY && eMode!=
37ae0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37af0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 65  E_OFF ){.      e
37b00 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20 20 20  Mode = eOld;.   
37b10 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 4d   }.  }..  if( eM
37b20 6f 64 65 21 3d 65 4f 6c 64 20 29 7b 0a 20 20 20  ode!=eOld ){.   
37b30 20 2f 2a 20 57 68 65 6e 20 63 68 61 6e 67 69 6e   /* When changin
37b40 67 20 62 65 74 77 65 65 6e 20 72 6f 6c 6c 62 61  g between rollba
37b50 63 6b 20 6d 6f 64 65 73 2c 20 63 6c 6f 73 65 20  ck modes, close 
37b60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37b70 20 70 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 6f   prior.    ** to
37b80 20 74 68 65 20 63 68 61 6e 67 65 2e 20 20 42 75   the change.  Bu
37b90 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  t when changing 
37ba0 66 72 6f 6d 20 61 20 72 6f 6c 6c 62 61 63 6b 20  from a rollback 
37bb0 6d 6f 64 65 20 74 6f 20 57 41 4c 2c 20 6b 65 65  mode to WAL, kee
37bc0 70 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  p.    ** the jou
37bd0 72 6e 61 6c 20 6f 70 65 6e 20 73 69 6e 63 65 20  rnal open since 
37be0 74 68 65 72 65 20 69 73 20 61 20 72 6f 6c 6c 62  there is a rollb
37bf0 61 63 6b 2d 73 74 79 6c 65 20 74 72 61 6e 73 61  ack-style transa
37c00 63 74 69 6f 6e 20 69 6e 20 70 6c 61 79 0a 20 20  ction in play.  
37c10 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 63 6f 6e    ** used to con
37c20 76 65 72 74 20 74 68 65 20 76 65 72 73 69 6f 6e  vert the version
37c30 20 6e 75 6d 62 65 72 73 20 69 6e 20 74 68 65 20   numbers in the 
37c40 62 74 72 65 65 20 68 65 61 64 65 72 2e 0a 20 20  btree header..  
37c50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
37c60 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
37c70 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47 45 52   && eMode!=PAGER
37c80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
37c90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
37ca0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
37cb0 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
37cc0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
37cd0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 2a 2f  journal mode. */
37ce0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
37cf0 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65  rnalMode = (u8)e
37d00 4d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  Mode;..    /* Wh
37d10 65 6e 20 74 72 61 6e 73 69 73 74 69 6f 6e 69 6e  en transistionin
37d20 67 20 66 72 6f 6d 20 54 52 55 4e 43 41 54 45 20  g from TRUNCATE 
37d30 6f 72 20 50 45 52 53 49 53 54 20 74 6f 20 61 6e  or PERSIST to an
37d40 79 20 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 0a  y other journal.
37d50 20 20 20 20 2a 2a 20 6d 6f 64 65 20 65 78 63 65      ** mode exce
37d60 70 74 20 57 41 4c 20 28 61 6e 64 20 77 65 20 61  pt WAL (and we a
37d70 72 65 20 6e 6f 74 20 69 6e 20 6c 6f 63 6b 69 6e  re not in lockin
37d80 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
37d90 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 64  ) then .    ** d
37da0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
37db0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  l file..    */. 
37dc0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
37dd0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
37de0 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
37df0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
37e00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37e10 5f 50 45 52 53 49 53 54 20 26 20 35 29 3d 3d 31  _PERSIST & 5)==1
37e20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37e30 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
37e40 44 45 5f 44 45 4c 45 54 45 20 26 20 35 29 3d 3d  DE_DELETE & 5)==
37e50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
37e60 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
37e70 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 35 29 3d  ODE_MEMORY & 5)=
37e80 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
37e90 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37ea0 4d 4f 44 45 5f 4f 46 46 20 26 20 35 29 3d 3d 30  MODE_OFF & 5)==0
37eb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37ec0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
37ed0 44 45 5f 57 41 4c 20 26 20 35 29 3d 3d 35 20 29  DE_WAL & 5)==5 )
37ee0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ;..    assert( i
37ef0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
37f00 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63  ) || pPager->exc
37f10 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20  lusiveMode );.  
37f20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
37f30 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
37f40 28 65 4f 6c 64 20 26 20 35 29 3d 3d 31 20 26 26  (eOld & 5)==1 &&
37f50 20 28 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30 20   (eMode & 1)==0 
37f60 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  ){..      /* In 
37f70 74 68 69 73 20 63 61 73 65 20 77 65 20 77 6f 75  this case we wou
37f80 6c 64 20 6c 69 6b 65 20 74 6f 20 64 65 6c 65 74  ld like to delet
37f90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
37fa0 6c 65 2e 20 49 66 20 69 74 20 69 73 0a 20 20 20  le. If it is.   
37fb0 20 20 20 2a 2a 20 6e 6f 74 20 70 6f 73 73 69 62     ** not possib
37fc0 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  le, then that is
37fd0 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 20   not a problem. 
37fe0 44 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  Deleting the jou
37ff0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
38000 2a 2a 20 68 65 72 65 20 69 73 20 61 6e 20 6f 70  ** here is an op
38010 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
38020 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
38030 2a 2a 20 42 65 66 6f 72 65 20 64 65 6c 65 74 69  ** Before deleti
38040 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
38050 69 6c 65 2c 20 6f 62 74 61 69 6e 20 61 20 52 45  ile, obtain a RE
38060 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
38070 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
38080 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
38090 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
380a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
380b0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 20 20 20   not deleted.   
380c0 20 20 20 2a 2a 20 77 68 69 6c 65 20 69 74 20 69     ** while it i
380d0 73 20 69 6e 20 75 73 65 20 62 79 20 73 6f 6d 65  s in use by some
380e0 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 2e 0a 20   other client.. 
380f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
38100 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
38110 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 74  ;.      int stat
38120 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  e = pPager->stat
38130 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  e;.      if( sta
38140 74 65 3c 50 41 47 45 52 5f 53 48 41 52 45 44 20  te<PAGER_SHARED 
38150 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38160 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
38170 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
38180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
38190 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
381a0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
381b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
381c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
381d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
381e0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
381f0 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
38200 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
38210 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
38220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38230 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
38240 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
38250 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
38260 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
38270 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
38280 4c 49 54 45 5f 4f 4b 20 26 26 20 73 74 61 74 65  LITE_OK && state
38290 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
382a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
382b0 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
382c0 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
382d0 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  K);.      }else 
382e0 69 66 28 20 73 74 61 74 65 3d 3d 50 41 47 45 52  if( state==PAGER
382f0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
38300 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
38310 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
38320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
38330 74 61 74 65 3d 3d 70 50 61 67 65 72 2d 3e 73 74  tate==pPager->st
38340 61 74 65 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ate );.    }.  }
38350 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
38360 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f  e new journal mo
38370 64 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  de */.  return (
38380 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
38390 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
383a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
383b0 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  rent journal mod
383c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
383d0 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
383e0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
383f0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 69  er){.  return (i
38400 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
38410 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alMode;.}../*.**
38420 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
38430 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
38440 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
38450 20 69 73 20 4f 4b 20 74 6f 20 63 68 61 6e 67 65   is OK to change
38460 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 6d   the.** journalm
38470 6f 64 65 2e 20 20 4a 6f 75 72 6e 61 6c 6d 6f 64  ode.  Journalmod
38480 65 20 63 68 61 6e 67 65 73 20 63 61 6e 20 6f 6e  e changes can on
38490 6c 79 20 68 61 70 70 65 6e 20 77 68 65 6e 20 74  ly happen when t
384a0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
384b0 73 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  s unmodified..*/
384c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
384d0 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e  rOkToChangeJourn
384e0 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
384f0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
38500 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
38510 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
38520 28 20 4e 45 56 45 52 28 69 73 4f 70 65 6e 28 70  ( NEVER(isOpen(p
38530 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
38540 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
38550 66 3e 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  f>0) ) return 0;
38560 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
38570 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
38580 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65  e size-limit use
38590 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  d for persistent
385a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
385b0 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68  **.** Setting th
385c0 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20  e size limit to 
385d0 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69  -1 means no limi
385e0 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a  t is enforced..*
385f0 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  * An attempt to 
38600 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c  set a limit smal
38610 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61  ler than -1 is a
38620 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73   no-op..*/.i64 s
38630 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
38640 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
38650 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
38660 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
38670 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
38680 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
38690 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
386a0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
386b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
386c0 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  izeLimit;.}../*.
386d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
386e0 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 65  ter to the pPage
386f0 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61  r->pBackup varia
38700 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20  ble. The backup 
38710 6d 6f 64 75 6c