/ Hex Artifact Content
Login

Artifact 2dffe4d468c7665cceaa43eb56e4b5c2f0d28396:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  ./*.** The Pager
1480: 2e 65 53 74 61 74 65 20 76 61 72 69 61 62 6c 65  .eState variable
1490: 20 73 74 6f 72 65 73 20 74 68 65 20 63 75 72 72   stores the curr
14a0: 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20 61  ent 'state' of a
14b0: 20 70 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67   pager. A.** pag
14c0: 65 72 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79  er may be in any
14d0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65   one of the seve
14e0: 6e 20 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69  n states shown i
14f0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
1500: 2a 2a 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  ** state diagram
1510: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b     OPEN <------+
1540: 2d 2d 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20  ------+.**      
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1570: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
15a0: 20 20 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a       |      |.**
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45  ---------> READE
15d0: 52 2d 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c  R-------+      |
15e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15f0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1600: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1610: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1620: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1630: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
1640: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
1650: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
1660: 2d 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d  -WRITER_LOCKED--
1670: 2d 2d 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20  ----> ERROR.**  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 20 20               ^  
16b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
16d0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
16e0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
16f0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49       |<------WRI
1700: 54 45 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d  TER_CACHEMOD----
1710: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1720: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1730: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1740: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1770: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c                |<
1790: 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42  -------WRITER_DB
17a0: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a  MOD---------->|.
17b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17c0: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
17d0: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |               
17e0: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
17f0: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1800: 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20     V            
1810: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
1820: 20 20 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57         +<------W
1830: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d  RITER_FINISHED--
1840: 2d 2d 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a  ------>+.**.**.*
1850: 2a 20 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20  * List of state 
1860: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
1870: 74 68 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d  the C [function]
1880: 20 74 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65   that performs e
1890: 61 63 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50  ach:.** .**   OP
18a0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EN              
18b0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
18c0: 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50         [sqlite3P
18d0: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a  agerSharedLock].
18e0: 2a 2a 20 20 20 52 45 41 44 45 52 20 20 20 20 20  **   READER     
18f0: 20 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20         -> OPEN  
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70                [p
1910: 61 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a  ager_unlock].**.
1920: 2a 2a 20 20 20 52 45 41 44 45 52 20 20 20 20 20  **   READER     
1930: 20 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52         -> WRITER
1940: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73  _LOCKED       [s
1950: 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1960: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f  ].**   WRITER_LO
1970: 43 4b 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54  CKED     -> WRIT
1980: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
1990: 5b 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72  [pager_open_jour
19a0: 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52  nal].**   WRITER
19b0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57  _CACHEMOD   -> W
19c0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
19d0: 20 20 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d     [syncJournal]
19e0: 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d  .**   WRITER_DBM
19f0: 4f 44 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45  OD      -> WRITE
1a00: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b  R_FINISHED     [
1a10: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1a20: 69 74 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20  itPhaseOne].**  
1a30: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1a40: 20 20 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20     -> READER    
1a50: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1a60: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1a70: 5d 0a 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52  ].**.**   WRITER
1a80: 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45  _***        -> E
1a90: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20  RROR            
1aa0: 20 20 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d     [pager_error]
1ab0: 0a 2a 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20  .**   ERROR     
1ac0: 20 20 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20          -> OPEN 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1ae0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a  pager_unlock].**
1af0: 20 0a 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a   .**.**  OPEN:.*
1b00: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
1b10: 72 20 73 74 61 72 74 73 20 75 70 20 69 6e 20 74  r starts up in t
1b20: 68 69 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69  his state. Nothi
1b30: 6e 67 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ng is guaranteed
1b40: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73   in this.**    s
1b50: 74 61 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20  tate - the file 
1b60: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
1b70: 65 20 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  e locked and the
1b80: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1b90: 73 0a 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e  s.**    unknown.
1ba0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   The database ma
1bb0: 79 20 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72  y not be read or
1bc0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
1bd0: 20 20 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20     * No read or 
1be0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1bf0: 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20  n is active..** 
1c00: 20 20 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f     * Any lock, o
1c10: 72 20 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c  r no lock at all
1c20: 2c 20 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e  , may be held on
1c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c40: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
1c50: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
1c60: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
1c70: 65 20 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20  e variables may 
1c80: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
1c90: 2a 2a 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a  **.**  READER:.*
1ca0: 2a 0a 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20  *.**    In this 
1cb0: 73 74 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65  state all the re
1cc0: 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72  quirements for r
1cd0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
1ce0: 61 73 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f  ase in .**    ro
1cf0: 6c 6c 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29  llback (non-WAL)
1d00: 20 6d 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55   mode are met. U
1d10: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
1d20: 69 73 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a  is (or recently.
1d30: 2a 2a 20 20 20 20 77 61 73 29 20 69 6e 20 65 78  **    was) in ex
1d40: 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
1d50: 6d 6f 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76  mode, a user-lev
1d60: 65 6c 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  el read transact
1d70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70  ion is .**    op
1d80: 65 6e 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  en. The database
1d90: 20 73 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69   size is known i
1da0: 6e 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a  n this state..**
1db0: 0a 2a 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74  .**    A connect
1dc0: 69 6f 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68  ion running with
1dd0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
1de0: 72 6d 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73  rmal enters this
1df0: 20 73 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20   state when.**  
1e00: 20 20 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61    it opens a rea
1e10: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d-transaction on
1e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1e30: 64 20 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61  d returns to sta
1e40: 74 65 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66  te.**    OPEN af
1e50: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
1e60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70  nsaction is comp
1e70: 6c 65 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61  leted. However a
1e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20   connection.**  
1e90: 20 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63    running in loc
1ea0: 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
1eb0: 69 76 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74  ive (including t
1ec0: 65 6d 70 20 64 61 74 61 62 61 73 65 73 29 20 72  emp databases) r
1ed0: 65 6d 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20  emains in.**    
1ee0: 74 68 69 73 20 73 74 61 74 65 20 65 76 65 6e 20  this state even 
1ef0: 61 66 74 65 72 20 74 68 65 20 72 65 61 64 2d 74  after the read-t
1f00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
1f10: 6f 73 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77  osed. The only w
1f20: 61 79 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69  ay.**    a locki
1f30: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
1f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
1f50: 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1f60: 20 52 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a   READER to OPEN.
1f70: 2a 2a 20 20 20 20 69 73 20 76 69 61 20 74 68 65  **    is via the
1f80: 20 45 52 52 4f 52 20 73 74 61 74 65 20 28 73 65   ERROR state (se
1f90: 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a  e below)..** .**
1fa0: 20 20 20 20 2a 20 41 20 72 65 61 64 20 74 72 61      * A read tra
1fb0: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
1fc0: 61 63 74 69 76 65 20 28 62 75 74 20 61 20 77 72  active (but a wr
1fd0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1fe0: 63 61 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a  cannot)..**    *
1ff0: 20 41 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   A SHARED or gre
2000: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2010: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2020: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2030: 54 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61  The dbSize varia
2040: 62 6c 65 20 6d 61 79 20 62 65 20 74 72 75 73 74  ble may be trust
2050: 65 64 20 28 65 76 65 6e 20 69 66 20 61 20 75 73  ed (even if a us
2060: 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a  er-level read .*
2070: 2a 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69  *      transacti
2080: 6f 6e 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65  on is not active
2090: 29 2e 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a  ). The dbOrigSiz
20a0: 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65  e and dbFileSize
20b0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20   variables.**   
20c0: 20 20 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72     may not be tr
20d0: 75 73 74 65 64 20 61 74 20 74 68 69 73 20 70 6f  usted at this po
20e0: 69 6e 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  int..**    * If 
20f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2100: 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
2110: 74 68 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e  then the WAL con
2120: 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e  nection is open.
2130: 0a 2a 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66  .**    * Even if
2140: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
2150: 69 6f 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ion is not open,
2160: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2170: 64 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  d that .**      
2180: 74 68 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d  there is no hot-
2190: 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66  journal in the f
21a0: 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a  ile-system..**.*
21b0: 2a 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  *  WRITER_LOCKED
21c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70  :.**.**    The p
21d0: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68  ager moves to th
21e0: 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45  is state from RE
21f0: 41 44 45 52 20 77 68 65 6e 20 61 20 77 72 69 74  ADER when a writ
2200: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
2210: 20 20 20 20 69 73 20 66 69 72 73 74 20 6f 70 65      is first ope
2220: 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
2230: 61 73 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c  ase. In WRITER_L
2240: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2250: 20 6c 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65   locks .**    re
2260: 71 75 69 72 65 64 20 74 6f 20 73 74 61 72 74 20  quired to start 
2270: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
2280: 69 6f 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75  ion are held, bu
2290: 74 20 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20  t no actual .** 
22a0: 20 20 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73     modifications
22b0: 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72   to the cache or
22c0: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 74   database have t
22d0: 61 6b 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a  aken place..**.*
22e0: 2a 20 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b  *    In rollback
22f0: 20 6d 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45   mode, a RESERVE
2300: 44 20 6f 72 20 28 69 66 20 74 68 65 20 74 72 61  D or (if the tra
2310: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
2320: 6e 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20  ned with .**    
2330: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29  BEGIN EXCLUSIVE)
2340: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2350: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
2360: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2370: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69   when.**    movi
2380: 6e 67 20 74 6f 20 74 68 69 73 20 73 74 61 74 65  ng to this state
2390: 2c 20 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61  , but the journa
23a0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72  l file is not wr
23b0: 69 74 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e  itten to or open
23c0: 65 64 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20  ed .**    to in 
23d0: 74 68 69 73 20 73 74 61 74 65 2e 20 49 66 20 74  this state. If t
23e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
23f0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  s committed or r
2400: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65  olled back while
2410: 20 0a 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45   .**    in WRITE
2420: 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20  R_LOCKED state, 
2430: 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
2440: 69 72 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63  ired is to unloc
2450: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  k the database .
2460: 2a 2a 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  **    file..**.*
2470: 2a 20 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65  *    IN WAL mode
2480: 2c 20 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  , WalBeginWriteT
2490: 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20  ransaction() is 
24a0: 63 61 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74  called to lock t
24b0: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20  he log file..** 
24c0: 20 20 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63     If the connec
24d0: 74 69 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20  tion is running 
24e0: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  with locking_mod
24f0: 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20  e=exclusive, an 
2500: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73  attempt.**    is
2510: 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
2520: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2530: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2540: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
2550: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2560: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2570: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2580: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2590: 70 65 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d  pen in rollback-
25a0: 6d 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44  mode, a RESERVED
25b0: 20 6f 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20   or greater .** 
25c0: 20 20 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c       lock is hel
25d0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
25e0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
25f0: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2600: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
2610: 2d 6d 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69  -mode, a WAL wri
2620: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te transaction.*
2630: 2a 20 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28  *      is open (
2640: 69 2e 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42  i.e. sqlite3WalB
2650: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
2660: 74 69 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20  tion() has been 
2670: 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20  successfully.** 
2680: 20 20 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a       called)..**
2690: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
26a0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
26b0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
26c0: 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61  ables are all va
26d0: 6c 69 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  lid..**    * The
26e0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26f0: 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 76   pager cache hav
2700: 65 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  e not been modif
2710: 69 65 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ied..**    * The
2720: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
2730: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
2740: 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f  open..**    * No
2750: 74 68 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20  thing (not even 
2760: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2770: 29 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  ) has been writt
2780: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2790: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  l..**.**  WRITER
27a0: 5f 43 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  _CACHEMOD:.**.**
27b0: 20 20 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65      A pager move
27c0: 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f  s from WRITER_LO
27d0: 43 4b 45 44 20 73 74 61 74 65 20 74 6f 20 74 68  CKED state to th
27e0: 69 73 20 73 74 61 74 65 20 77 68 65 6e 20 61 20  is state when a 
27f0: 70 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69  page is.**    fi
2800: 72 73 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20  rst modified by 
2810: 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e  the upper layer.
2820: 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64   In rollback mod
2830: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2840: 6c 65 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e  le.**    is open
2850: 65 64 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ed (if it is not
2860: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61   already open) a
2870: 6e 64 20 61 20 68 65 61 64 65 72 20 77 72 69 74  nd a header writ
2880: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
2890: 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68   start of it. Th
28a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28b0: 6f 6e 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20  on disk has not 
28c0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
28d0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
28e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
28f0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
2900: 20 41 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   A RESERVED or g
2910: 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68  reater lock is h
2920: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2930: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ase file..**    
2940: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2950: 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  le is open and t
2960: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
2970: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2980: 20 0a 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c   .**      to it,
2990: 20 62 75 74 20 74 68 65 20 68 65 61 64 65 72 20   but the header 
29a0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e  has not been syn
29b0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20  ced to disk..** 
29c0: 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74     * The content
29d0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
29e0: 63 68 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  che have been mo
29f0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57  dified..**.**  W
2a00: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a  RITER_DBMOD:.**.
2a10: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a30: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a40: 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20 67  n EXCLUSIVE or g
2a50: 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68  reater lock is h
2a60: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2a70: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ase file..**    
2a80: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2a90: 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  le is open and t
2aa0: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
2ab0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2ac0: 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73 79   .**      and sy
2ad0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2ae0: 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e      * The conten
2af0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
2b00: 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20 6d  ache have been m
2b10: 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f 73  odified (and pos
2b20: 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77 72  sibly.**      wr
2b30: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e 0a  itten to disk)..
2b40: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46 49  **.**  WRITER_FI
2b50: 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  NISHED:.**.**   
2b60: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2b70: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2b80: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2b90: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
2ba0: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2bb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2bc0: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
2bd0: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
2be0: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
2bf0: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
2c00: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
2c10: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
2c20: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
2c30: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
2c40: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2c50: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
2c60: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
2c70: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
2c80: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
2c90: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
2ca0: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
2cb0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
2cc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
2cd0: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
2ce0: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
2cf0: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
2d00: 77 68 65 6e 20 61 6e 20 49 4f 2c 20 4f 4f 4d 20  when an IO, OOM 
2d10: 6f 72 20 64 69 73 6b 2d 66 75 6c 6c 20 65 72 72  or disk-full err
2d20: 6f 72 20 0a 2a 2a 20 20 20 20 6f 63 63 75 72 73  or .**    occurs
2d30: 20 61 74 20 61 20 70 6f 69 6e 74 20 69 6e 20 74   at a point in t
2d40: 68 65 20 63 6f 64 65 20 74 68 61 74 20 6d 61 6b  he code that mak
2d50: 65 73 20 69 74 20 64 69 66 66 69 63 75 6c 74 20  es it difficult 
2d60: 74 6f 20 62 65 20 73 75 72 65 0a 2a 2a 20 20 20  to be sure.**   
2d70: 20 74 68 61 74 20 74 68 65 20 69 6e 2d 6d 65 6d   that the in-mem
2d80: 6f 72 79 20 70 61 67 65 72 20 73 74 61 74 65 20  ory pager state 
2d90: 28 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 73 2c  (cache contents,
2da0: 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61   db size etc.) a
2db0: 72 65 0a 2a 2a 20 20 20 20 63 6f 6e 73 69 73 74  re.**    consist
2dc0: 65 6e 74 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ent with the con
2dd0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 66 69 6c  tents of the fil
2de0: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2df0: 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20     For example, 
2e00: 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2e10: 63 63 75 72 73 20 77 68 69 6c 65 20 70 65 72 66  ccurs while perf
2e20: 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  orming a rollbac
2e30: 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20 63 6f  k, .**    the co
2e40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2e50: 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62 65 20  ge-cache may be 
2e60: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
2e70: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 2a  sistent state..*
2e80: 2a 20 20 20 20 41 74 20 74 68 69 73 20 70 6f 69  *    At this poi
2e90: 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 64  nt it would be d
2ea0: 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68 61 6e  angerous to chan
2eb0: 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41 44 45  ge back to READE
2ec0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 28 61  R state.**    (a
2ed0: 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70 65 6e  s usually happen
2ee0: 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  s after a rollba
2ef0: 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65 71 75  ck). Any subsequ
2f00: 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69 67 68  ent readers migh
2f10: 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74 20 64  t.**    report d
2f20: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2f30: 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65 20 69  on (due to the i
2f40: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
2f50: 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20 20 20  e), and if.**   
2f60: 20 74 68 65 79 20 75 70 67 72 61 64 65 20 74 6f   they upgrade to
2f70: 20 77 72 69 74 65 72 73 2c 20 74 68 65 79 20 6d   writers, they m
2f80: 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74 6c 79  ay inadvertently
2f90: 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
2fa0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69 6c 65  abase.**    file
2fb0: 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 20  . To avoid this 
2fc0: 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61 67 65  hazard, the page
2fd0: 72 20 73 77 69 74 63 68 65 73 20 69 6e 74 6f 20  r switches into 
2fe0: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 0a  the ERROR state.
2ff0: 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20 6f 66  **    instead of
3000: 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77 69 6e   READER followin
3010: 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f 72 2e  g such an error.
3020: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65 20 69  .**.**    Once i
3030: 74 20 68 61 73 20 65 6e 74 65 72 65 64 20 74 68  t has entered th
3040: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 61  e ERROR state, a
3050: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
3060: 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  e the pager.**  
3070: 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69    to read or wri
3080: 74 65 20 64 61 74 61 20 72 65 74 75 72 6e 73 20  te data returns 
3090: 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e 74 75  an error. Eventu
30a0: 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c 20 0a  ally, once all .
30b0: 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64 69 6e  **    outstandin
30c0: 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68  g transactions h
30d0: 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64 6f 6e  ave been abandon
30e0: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  ed, the pager is
30f0: 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 74   able to.**    t
3100: 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74  ransition back t
3110: 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 64 69  o OPEN state, di
3120: 73 63 61 72 64 69 6e 67 20 74 68 65 20 63 6f 6e  scarding the con
3130: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
3140: 20 20 20 20 70 61 67 65 2d 63 61 63 68 65 20 61      page-cache a
3150: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 2d  nd any other in-
3160: 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61 74 20  memory state at 
3170: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 45  the same time. E
3180: 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20 20 20  verything.**    
3190: 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
31a0: 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66 20 6e   disk (and, if n
31b0: 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d 6a 6f  ecessary, hot-jo
31c0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 70  urnal rollback p
31d0: 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20 20 77  eformed).**    w
31e0: 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
31f0: 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74 20 6f  action is next o
3200: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70 61 67  pened on the pag
3210: 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e 69 6e  er (transitionin
3220: 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61 67 65  g.**    the page
3230: 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20 73 74  r into READER st
3240: 61 74 65 29 2e 20 41 74 20 74 68 61 74 20 70 6f  ate). At that po
3250: 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d 20 68  int the system h
3260: 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a 2a 2a  as recovered .**
3270: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65 72 72      from the err
3280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 70 65  or..**.**    Spe
3290: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 70  cifically, the p
32a0: 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74 6f 20  ager jumps into 
32b0: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
32c0: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  if:.**.**      1
32d0: 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  . An error occur
32e0: 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69  s while attempti
32f0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 54  ng a rollback. T
3300: 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  his happens in.*
3310: 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  *         functi
3320: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  on sqlite3PagerR
3330: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a  ollback()..**.**
3340: 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72 72 6f        2. An erro
3350: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61  r occurs while a
3360: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66 69 6e  ttempting to fin
3370: 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61 6c 20  alize a journal 
3380: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
3390: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f 6d 6d  following a comm
33a0: 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 73  it in function s
33b0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
33c0: 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a 2a 0a  tPhaseTwo()..**.
33d0: 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20 65 72  **      3. An er
33e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
33f0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 77   attempting to w
3400: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
3410: 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  nal or.**       
3420: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
3430: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  in function page
3440: 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f 72 64  rStress() in ord
3450: 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a 2a 2a  er to free up.**
3460: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 2e           memory.
3470: 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f 74 68  .**.**    In oth
3480: 65 72 20 63 61 73 65 73 2c 20 74 68 65 20 65 72  er cases, the er
3490: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
34a0: 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  to the b-tree la
34b0: 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65 65 0a  yer. The b-tree.
34c0: 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68 65 6e  **    layer then
34d0: 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f 6c 6c   attempts a roll
34e0: 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
34f0: 49 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 6e  If the error con
3500: 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 70 65  dition .**    pe
3510: 72 73 69 73 74 73 2c 20 74 68 65 20 70 61 67 65  rsists, the page
3520: 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52  r enters the ERR
3530: 4f 52 20 73 74 61 74 65 20 76 69 61 20 63 6f 6e  OR state via con
3540: 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65  dition (1) above
3550: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e 64 69  ..**.**    Condi
3560: 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65 63 65  tion (3) is nece
3570: 73 73 61 72 79 20 62 65 63 61 75 73 65 20 69 74  ssary because it
3580: 20 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65   can be triggere
3590: 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79  d by a read-only
35a0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65 6e 74  .**    statement
35b0: 20 65 78 65 63 75 74 65 64 20 77 69 74 68 69 6e   executed within
35c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
35d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 66  In this case, if
35e0: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 20 20   the error.**   
35f0: 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d 70 6c   code were simpl
3600: 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  y returned to th
3610: 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d 74 72  e user, the b-tr
3620: 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64 20 6e  ee layer would n
3630: 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d 61 74  ot.**    automat
3640: 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 61  ically attempt a
3650: 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 69 74   rollback, as it
3660: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e   assumes that an
3670: 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a 20 20   error in a.**  
3680: 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74 61 74    read-only stat
3690: 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c 65 61  ement cannot lea
36a0: 76 65 20 74 68 65 20 70 61 67 65 72 20 69 6e 20  ve the pager in 
36b0: 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  an internally in
36c0: 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a 20 20  consistent .**  
36d0: 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20    state..**.**  
36e0: 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e 65 72    * The Pager.er
36f0: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
3700: 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68 69  s set to somethi
3710: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
3720: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20 20 2a  LITE_OK..**    *
3730: 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   There are one o
3740: 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
3750: 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
3760: 20 70 61 67 65 73 20 28 61 66 74 65 72 20 74 68   pages (after th
3770: 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74 20 72  e.**      last r
3780: 65 66 65 72 65 6e 63 65 20 69 73 20 64 72 6f 70  eference is drop
3790: 70 65 64 20 74 68 65 20 70 61 67 65 72 20 73 68  ped the pager sh
37a0: 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b 20 74  ould move back t
37b0: 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e 0a 2a  o OPEN state)..*
37c0: 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  *    .**.** Note
37d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70  s:.**.**   * A p
37e0: 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e  ager is never in
37f0: 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72   WRITER_DBMOD or
3800: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
3810: 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a   state if the.**
3820: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
3830: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d  is open in WAL m
3840: 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65  ode. A WAL conne
3850: 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ction is always 
3860: 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66  in one.**     of
3870: 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20   the first four 
3880: 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  states..**.**   
3890: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f  * Normally, a co
38a0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e  nnection open in
38b0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
38c0: 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45  is never in PAGE
38d0: 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74  R_OPEN.**     st
38e0: 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ate. There are t
38f0: 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69  wo exceptions: i
3900: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
3910: 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20   exclusive-mode 
3920: 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  has.**     been 
3930: 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62  turned on (and b
3940: 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f  efore any read o
3950: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
3960: 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20  ions are .**    
3970: 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20   executed), and 
3980: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  when the pager i
3990: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65  s leaving the "e
39a0: 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a  rror state"..**.
39b0: 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a  **   * See also:
39c0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
39d0: 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ate()..*/.#defin
39e0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  e PAGER_OPEN    
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
3a00: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45  #define PAGER_RE
3a10: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  ADER            
3a20: 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41      1.#define PA
3a30: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
3a40: 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66  D         2.#def
3a50: 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ine PAGER_WRITER
3a60: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20  _CACHEMOD       
3a70: 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  3.#define PAGER_
3a80: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
3a90: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
3aa0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
3ab0: 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64  ISHED       5.#d
3ac0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f  efine PAGER_ERRO
3ad0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
3ae0: 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50    6../*.** The P
3af0: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
3b00: 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  ble is almost al
3b10: 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  ways set to one 
3b20: 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
3b30: 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61  wing locking-sta
3b40: 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  tes, according t
3b50: 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65  o the lock curre
3b60: 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20  ntly held on.** 
3b70: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3b80: 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  e: NO_LOCK, SHAR
3b90: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
3ba0: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
3bb0: 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69  IVE_LOCK..** Thi
3bc0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65  s variable is ke
3bd0: 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73  pt up to date as
3be0: 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e   locks are taken
3bf0: 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79   and released by
3c00: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63  .** the pagerLoc
3c10: 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55  kDb() and pagerU
3c20: 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65  nlockDb() wrappe
3c30: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
3c40: 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20   VFS xLock() or 
3c50: 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e  xUnlock() return
3c60: 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72  s an error other
3c70: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53   than SQLITE_BUS
3c80: 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f  Y.** (i.e. one o
3c90: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
3ca0: 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74  RR subtypes), it
3cb0: 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68   is not clear wh
3cc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
3cd0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61  the operation wa
3ce0: 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e  s successful. In
3cf0: 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61   these circumsta
3d00: 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62  nces pagerLockDb
3d10: 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55  () and.** pagerU
3d20: 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61  nlockDb() take a
3d30: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70   conservative ap
3d40: 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69  proach - eLock i
3d50: 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64  s always updated
3d60: 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69  .** when unlocki
3d70: 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  ng the file, and
3d80: 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68   only updated wh
3d90: 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66  en locking the f
3da0: 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46  ile if the.** VF
3db0: 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73  S call is succes
3dc0: 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20  sful. This way, 
3dd0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
3de0: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20  variable may be 
3df0: 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73  set.** to a less
3e00: 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65   exclusive (lowe
3e10: 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68  r) value than th
3e20: 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61  e lock that is a
3e30: 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20  ctually held.** 
3e40: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
3e50: 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e  vel, but it is n
3e60: 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f  ever set to a mo
3e70: 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c  re exclusive val
3e80: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ue..**.** This i
3e90: 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20  s usually safe. 
3ea0: 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61  If an xUnlock fa
3eb0: 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74  ils or appears t
3ec0: 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61  o fail, there ma
3ed0: 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72  y .** be a few r
3ee0: 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29  edundant xLock()
3ef0: 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b   calls or a lock
3f00: 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72   may be held for
3f10: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20   longer than.** 
3f20: 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f  required, but no
3f30: 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65  thing really goe
3f40: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  s wrong..**.** T
3f50: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3f60: 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  when the databas
3f70: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
3f80: 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ed as the pager 
3f90: 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52  moves.** from ER
3fa0: 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ROR to OPEN stat
3fb0: 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
3fc0: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
3fd0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
3fe0: 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65   .** in the file
3ff0: 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65  -system that nee
4000: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
4010: 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66  back (as part of
4020: 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a   a OPEN->SHARED.
4030: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4040: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4050: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4060: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4070: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
4080: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
4090: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
40a0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
40b0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
40c0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
40d0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
40e0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
40f0: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4100: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4110: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4120: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4130: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4140: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4150: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4160: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4170: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
4180: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
4190: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
41a0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
41b0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
41c0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
41d0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
41e0: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
41f0: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4200: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4210: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4220: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4230: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4240: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4250: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4260: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4270: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
4280: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
4290: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
42a0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
42b0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
42c0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
42d0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
42e0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
42f0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4300: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4310: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4320: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4330: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4340: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4350: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4360: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4370: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
4380: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
4390: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
43a0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
43b0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
43c0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
43d0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
43e0: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
43f0: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4400: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4410: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4420: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4430: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4440: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4450: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4460: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4470: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
4480: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
4490: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
44a0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
44b0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
44c0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
44d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
44e0: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
44f0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4500: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4510: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4520: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4530: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4540: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4550: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4560: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4570: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4580: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4590: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
45a0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
45b0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
45c0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
45d0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
45e0: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
45f0: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4600: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4610: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4620: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4630: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4640: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4650: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4660: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4670: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4680: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4690: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
46a0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
46b0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
46c0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
46d0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
46e0: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
46f0: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4700: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4710: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4720: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4730: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4740: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4750: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4760: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4770: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4780: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4790: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
47a0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
47b0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
47c0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
47d0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
47e0: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
47f0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4800: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4810: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4820: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4830: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4840: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4850: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4860: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4870: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4880: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4890: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
48a0: 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  10000../*.** An 
48b0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
48c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
48d0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
48e0: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
48f0: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
4900: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
4910: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
4920: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
4930: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
4940: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
4950: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
4960: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
4970: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
4980: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
4990: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
49a0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
49b0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
49c0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
49d0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
49e0: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
49f0: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
4a00: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
4a10: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
4a20: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
4a30: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
4a40: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
4a50: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
4a60: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
4a70: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
4a80: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
4a90: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
4aa0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
4ab0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
4ac0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
4ad0: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
4ae0: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
4af0: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
4b00: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
4b10: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
4b20: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
4b30: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
4b40: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
4b50: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
4b60: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
4b70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
4b80: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
4bb0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
4bc0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
4bd0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4be0: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
4bf0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
4c00: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
4c10: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
4c20: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
4c30: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
4c40: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
4c50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
4c60: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
4c70: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
4c80: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ca0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
4cb0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
4cc0: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
4cd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
4ce0: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
4cf0: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
4d00: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
4d10: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
4d20: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
4d30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  };../*.** A open
4d40: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
4d50: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
4d60: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
4d70: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
4d80: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
4d90: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
4da0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
4db0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
4dc0: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
4dd0: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
4de0: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
4df0: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
4e10: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
4e20: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
4e30: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
4e40: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
4e50: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
4e60: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
4e70: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
4e80: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
4e90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4ea0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
4eb0: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
4ec0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
4ed0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
4ee0: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
4ef0: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
4f00: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
4f10: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
4f20: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
4f30: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
4f40: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
4f50: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
4f60: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
4f70: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
4f80: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
4f90: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
4fa0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
4fb0: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
4fc0: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
4fd0: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
4fe0: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
4ff0: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5000: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5010: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5020: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5030: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5040: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
5050: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
5060: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
5070: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
5080: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
5090: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
50a0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
50b0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
50c0: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
50d0: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
50e0: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
50f0: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5100: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5110: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5120: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5130: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5140: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
5150: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
5160: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
5170: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
5180: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
5190: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
51a0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
51b0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
51c0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
51d0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
51e0: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
51f0: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5200: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5210: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5220: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5230: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5240: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
5250: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
5260: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
5270: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
5280: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
5290: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
52a0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
52b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
52c0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
52d0: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
52e0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
52f0: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5300: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5310: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5320: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5330: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5340: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
5350: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
5360: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
5370: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
5380: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
5390: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
53a0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
53b0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
53c0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
53d0: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
53e0: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
53f0: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5400: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5410: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5420: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5430: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5440: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5450: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5460: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5470: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5480: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5490: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
54a0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
54b0: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
54c0: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
54d0: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
54e0: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
54f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5500: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5510: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5520: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5530: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5540: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5550: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5560: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5570: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5580: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5590: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
55a0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
55b0: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
55c0: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
55d0: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
55e0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
55f0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5600: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5610: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5620: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5630: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5640: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5650: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5660: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5670: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5680: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5690: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
56a0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
56b0: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
56c0: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
56d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
56e0: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
56f0: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5700: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5710: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5720: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5730: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5740: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5750: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5760: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5770: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5780: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5790: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
57a0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
57b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
57c0: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
57d0: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
57e0: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
57f0: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5800: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5810: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5820: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5830: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5840: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5850: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5860: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5870: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5880: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5890: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
58a0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
58b0: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
58c0: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
58d0: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
58e0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
58f0: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5900: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5910: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5920: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5930: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5940: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5950: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5960: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
5970: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
5980: 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77 6f  *.**   These two
5990: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
59a0: 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 62  es control the b
59b0: 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63 68  ehaviour of cach
59c0: 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28 63  e-spills.**   (c
59d0: 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65  alls made by the
59e0: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 74   pcache module t
59f0: 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  o the pagerStres
5a00: 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a  s() routine to.*
5a10: 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65 64  *   write cached
5a20: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
5a30: 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64 65  e-system in orde
5a40: 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
5a50: 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68  ory)..**.**   Wh
5a60: 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69 73  en doNotSpill is
5a70: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69   non-zero, writi
5a80: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
5a90: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
5aa0: 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64 69  ess().**   is di
5ab0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
5ac0: 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  r. This is done 
5ad0: 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75 72  in a very obscur
5ae0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 20  e case that.**  
5af0: 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e 67   comes up during
5b00: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
5b10: 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72 65  ack that require
5b20: 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  s the pcache mod
5b30: 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f  ule.**   to allo
5b40: 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
5b50: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 6a  to prevent the j
5b60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5b70: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a   being written.*
5b80: 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73 20  *   while it is 
5b90: 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64 20  being traversed 
5ba0: 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65 72  by code in pager
5bb0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a 20  _playback()..** 
5bc0: 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53 79  .**   If doNotSy
5bd0: 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  ncSpill is non-z
5be0: 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f 20  ero, writing to 
5bf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f  the database fro
5c00: 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  m pagerStress().
5c10: 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74 65  **   is permitte
5c20: 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74  d, but syncing t
5c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5c40: 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61  is not. This fla
5c50: 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79  g is set.**   by
5c60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
5c70: 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69  te() when the fi
5c80: 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72  le-system sector
5c90: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
5ca0: 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61  than.**   the da
5cb0: 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65  tabase page-size
5cc0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
5cd0: 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73  vent a journal s
5ce0: 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69  ync from happeni
5cf0: 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77  ng .**   in betw
5d00: 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c  een the journall
5d10: 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73  ing of two pages
5d20: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63   on the same sec
5d30: 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a  tor. .**.** subj
5d40: 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20  InMemory.**.**  
5d50: 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65   This is a boole
5d60: 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20  an variable. If 
5d70: 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72  true, then any r
5d80: 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72  equired sub-jour
5d90: 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e  nal.**   is open
5da0: 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
5db0: 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ry journal file.
5dc0: 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   If false, then 
5dd0: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73  in-memory.**   s
5de0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20  ub-journals are 
5df0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e  only used for in
5e00: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69  -memory pager fi
5e10: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  les..**.**   Thi
5e20: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 70  s variable is up
5e30: 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70 70  dated by the upp
5e40: 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74 69  er layer each ti
5e50: 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77  me a new .**   w
5e60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
5e70: 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a   is opened..**.*
5e80: 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67  * dbSize, dbOrig
5e90: 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65  Size, dbFileSize
5ea0: 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c  .**.**   Variabl
5eb0: 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74 20  e dbSize is set 
5ec0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
5ed0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
5ee0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5ef0: 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e    It is valid in
5f00: 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e   PAGER_READER an
5f10: 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73 20  d higher states 
5f20: 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65  (all states exce
5f30: 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e  pt for.**   OPEN
5f40: 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a   and ERROR). .**
5f50: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
5f60: 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65  set based on the
5f70: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
5f80: 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
5f90: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c  h may be .**   l
5fa0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
5fb0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
5fc0: 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20 73  ase (the value s
5fd0: 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a  tored at offset.
5fe0: 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20 64  **   28 of the d
5ff0: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 62  atabase header b
6000: 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49 66  y the btree). If
6010: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6020: 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f   file.**   is no
6030: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c  t an integer mul
6040: 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
6050: 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75  e-size, the valu
6060: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20  e stored in.**  
6070: 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64   dbSize is round
6080: 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20  ed down (i.e. a 
6090: 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  5KB file with 2K
60a0: 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64   page-size has d
60b0: 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20  bSize==2)..**   
60c0: 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65  Except, any file
60d0: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
60e0: 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
60f0: 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65   size is conside
6100: 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65  red.**   to have
6110: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61   at least one pa
6120: 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20  ge. (i.e. a 1KB 
6130: 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67  file with 2K pag
6140: 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20  e-size leads.** 
6150: 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e    to dbSize==1).
6160: 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20  .**.**   During 
6170: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
6180: 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69  ion, if pages wi
6190: 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20  th page-numbers 
61a0: 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
61b0: 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64    dbSize are mod
61c0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61 63  ified in the cac
61d0: 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70  he, dbSize is up
61e0: 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
61f0: 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c  y..**   Similarl
6200: 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  y, if the databa
6210: 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  se is truncated 
6220: 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63  using PagerTrunc
6230: 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20  ateImage(), .** 
6240: 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61    dbSize is upda
6250: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  ted..**.**   Var
6260: 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a  iables dbOrigSiz
6270: 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65  e and dbFileSize
6280: 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74   are valid in st
6290: 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52  ates .**   PAGER
62a0: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61  _WRITER_LOCKED a
62b0: 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69  nd higher. dbOri
62c0: 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20  gSize is a copy 
62d0: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a  of the dbSize.**
62e0: 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20 74     variable at t
62f0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
6300: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
6310: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 72  is used during r
6320: 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e  ollback,.**   an
6330: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
6340: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61  hether or not pa
6350: 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  ges need to be j
6360: 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65  ournalled before
6370: 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69  .**   being modi
6380: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  fied..**.**   Th
6390: 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74 65  roughout a write
63a0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62  -transaction, db
63b0: 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e  FileSize contain
63c0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a  s the size of.**
63d0: 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64     the file on d
63e0: 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74  isk in pages. It
63f0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70   is set to a cop
6400: 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e  y of dbSize when
6410: 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d   the.**   write-
6420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66  transaction is f
6430: 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64  irst opened, and
6440: 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56 46   updated when VF
6450: 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65  S calls are made
6460: 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f  .**   to write o
6470: 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  r truncate the d
6480: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
6490: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 65 72 72 43  disk..**.** errC
64a0: 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ode.**.**   The 
64b0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
64c0: 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20 65  riable is only e
64d0: 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47 45  ver used in PAGE
64e0: 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
64f0: 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74 6f  t.**   is set to
6500: 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68   zero in all oth
6510: 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50 41  er states. In PA
6520: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2c  GER_ERROR state,
6530: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 0a   Pager.errCode .
6540: 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20 73  **   is always s
6550: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55 4c  et to SQLITE_FUL
6560: 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
6570: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  or one of the SQ
6580: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 0a  LITE_IOERR_XXX .
6590: 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e 0a  **   sub-codes..
65a0: 2a 2a 0a 2a 2a 20 20 20 49 66 20 50 61 67 65 72  **.**   If Pager
65b0: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  .errCode is set 
65c0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  to SQLITE_IOERR 
65d0: 6f 72 20 6f 6e 65 20 6f 66 20 69 74 73 20 73 75  or one of its su
65e0: 62 63 6f 64 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  bcodes, then.** 
65f0: 20 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20    this value is 
6600: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
6610: 72 6e 65 64 20 77 68 65 6e 20 65 76 65 72 20 61  rned when ever a
6620: 6e 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 58  ny sqlite3PagerX
6630: 58 58 28 29 20 6d 65 74 68 6f 64 0a 2a 2a 20 20  XX() method.**  
6640: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 6e   that returns an
6650: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 63   error code is c
6660: 61 6c 6c 65 64 2e 20 49 66 20 69 74 20 69 73 20  alled. If it is 
6670: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
6680: 4c 4c 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 69 74  LL,.**   then it
6690: 20 69 73 20 72 65 74 75 72 6e 65 64 20 77 68 65   is returned whe
66a0: 6e 65 76 65 72 20 61 6e 79 20 73 75 63 68 20 73  never any such s
66b0: 71 6c 69 74 65 33 50 61 67 65 72 58 58 58 28 29  qlite3PagerXXX()
66c0: 20 6d 65 74 68 6f 64 20 65 78 63 65 70 74 0a 2a   method except.*
66d0: 2a 20 20 20 66 6f 72 20 50 61 67 65 72 41 63 71  *   for PagerAcq
66e0: 75 69 72 65 28 29 20 6f 72 20 50 61 67 65 72 4c  uire() or PagerL
66f0: 6f 6f 6b 75 70 28 29 20 69 73 20 63 61 6c 6c 65  ookup() is calle
6700: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a  d..**.**   TODO:
6710: 20 52 65 76 69 65 77 20 74 68 65 20 53 51 4c 49   Review the SQLI
6720: 54 45 5f 46 55 4c 4c 2f 50 61 67 65 72 41 63 71  TE_FULL/PagerAcq
6730: 75 69 72 65 28 29 20 65 78 63 65 70 74 69 6f 6e  uire() exception
6740: 2e 20 49 73 20 69 74 20 61 20 67 6f 6f 64 20 69  . Is it a good i
6750: 64 65 61 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20  dea?.**         
6760: 49 66 20 73 6f 2c 20 61 72 65 20 74 68 65 72 65  If so, are there
6770: 20 62 75 67 73 20 77 68 65 72 65 62 79 20 73 68   bugs whereby sh
6780: 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
6790: 74 73 20 63 61 6e 20 73 65 65 20 0a 2a 2a 20 20  ts can see .**  
67a0: 20 20 20 20 20 20 20 75 6e 63 6f 6d 6d 69 74 74         uncommitt
67b0: 65 64 20 64 61 74 61 20 77 68 65 6e 20 74 68 65  ed data when the
67c0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
67d0: 20 45 52 52 4f 52 20 73 74 61 74 65 3f 0a 2a 2a   ERROR state?.**
67e0: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
67f0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
6800: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
6810: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
6820: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
6830: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
6840: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
6850: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
6860: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
6870: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
6880: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68a0: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
68b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
68c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
68d0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
68e0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
68f0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
6900: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
6910: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
6920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6930: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
6940: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
6950: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  cks */.  u8 noSy
6960: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
6970: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
6980: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6990: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
69a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
69b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
69c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
69d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
69e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
69f0: 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20   sync_flags;    
6a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
6a10: 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   of SYNC_NORMAL 
6a20: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a  or SYNC_FULL */.
6a30: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a50: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
6a60: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
6a70: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
6aa0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
6ab0: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
6ae0: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
6af0: 4f 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  O */..  /* The f
6b00: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63  ollowing block c
6b10: 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c  ontains those cl
6b20: 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ass members that
6b30: 20 61 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79   are dynamically
6b40: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64  .  ** modified d
6b50: 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65  uring normal ope
6b60: 72 61 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68  rations. The oth
6b70: 65 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  er variables in 
6b80: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 20  this structure. 
6b90: 20 2a 2a 20 61 72 65 20 65 69 74 68 65 72 20 63   ** are either c
6ba0: 6f 6e 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f  onstant througho
6bb0: 75 74 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ut the lifetime 
6bc0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72  of the pager, or
6bd0: 20 65 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20   else.  ** used 
6be0: 74 6f 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75  to store configu
6bf0: 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  ration parameter
6c00: 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
6c10: 65 20 77 61 79 20 74 68 65 20 70 61 67 65 72 20  e way the pager 
6c20: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a  .  ** operates..
6c30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73    **.  ** The 's
6c40: 74 61 74 65 27 20 76 61 72 69 61 62 6c 65 20 69  tate' variable i
6c50: 73 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d  s described in m
6c60: 6f 72 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67  ore detail along
6c70: 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64   with the.  ** d
6c80: 65 73 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74  escriptions of t
6c90: 68 65 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79  he values it may
6ca0: 20 74 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e   take - PAGER_UN
6cb0: 4c 4f 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f  LOCK etc. Many o
6cc0: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  f the.  ** other
6cd0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
6ce0: 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73  is block are des
6cf0: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f  cribed in the co
6d00: 6d 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a  mment directly .
6d10: 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20    ** above this 
6d20: 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e  class definition
6d30: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ..  */.  u8 eSta
6d40: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
6d50: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
6d60: 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45  ate (OPEN, READE
6d70: 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  R, WRITER_LOCKED
6d80: 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63  ..) */.  u8 eLoc
6d90: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
6da0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
6db0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74  lock held on dat
6dc0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
6dd0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
6de0: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
6df0: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
6e00: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
6e10: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
6e20: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
6e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6e40: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
6e50: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
6e60: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
6e70: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
6e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
6e90: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
6ea0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
6eb0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
6ec0: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
6ed0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
6ee0: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
6ef0: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
6f00: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
6f10: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
6f20: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
6f30: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
6f40: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
6f50: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
6f60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6f70: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6f80: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
6f90: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
6fb0: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
6fc0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
6fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
6fe0: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
6ff0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7000: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7010: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7020: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7040: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7050: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7060: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7090: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
70a0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
70b0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
70c0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
70d0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
70e0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
70f0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7100: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7110: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7120: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7130: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7140: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7150: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7160: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7170: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7180: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7190: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
71a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
71b0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
71c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
71d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
71e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
71f0: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7200: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7210: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7220: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7230: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7240: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7250: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7260: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7270: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7280: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7290: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
72a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
72b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
72c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
72d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
72e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
72f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7300: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
7310: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
7320: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
7330: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
7340: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
7350: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
7360: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
7370: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
7380: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
7390: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
73b0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
73c0: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
73d0: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
73e0: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
73f0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
7400: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
7410: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ile changes */. 
7420: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7440: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
7450: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
7460: 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  ack */..  u16 nE
7470: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
7480: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
7490: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
74a0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
74b0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
74c0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
74d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
74e0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
74f0: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
7500: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
7510: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7520: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
7530: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
7540: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
7550: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
7560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7570: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
7580: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
7590: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
75a0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
75b0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
75c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
75d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
75e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
75f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
7600: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
7610: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
7620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
7630: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
7640: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
7650: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
7660: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
7670: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
7680: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
7690: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
76a0: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
76b0: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
76c0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
76d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
76e0: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
76f0: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
7700: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
7710: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
7720: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
7730: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
7740: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
7750: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
7760: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
7770: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
7780: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
7790: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
77a0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
77b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
77c0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
77d0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
77e0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
77f0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
7800: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
7810: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
7820: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
7830: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
7840: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
7850: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
7860: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
7870: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
7880: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
7890: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
78a0: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
78b0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
78c0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
78d0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
78e0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
78f0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
7900: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
7910: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
7920: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
7930: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
7940: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
7950: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
7960: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
7970: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
7980: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
7990: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
79a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
79b0: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
79c0: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
79d0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
79e0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
79f0: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
7a10: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
7a20: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
7a30: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
7a40: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
7a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7a60: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
7a70: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
7a80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
7a90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
7aa0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
7ab0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
7ac0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
7ad0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
7ae0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
7af0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
7b00: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
7b10: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
7b20: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
7b30: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
7b40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
7b50: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
7b60: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
7b70: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
7b80: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
7b90: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
7ba0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
7bb0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
7bc0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
7bd0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
7be0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
7bf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
7c00: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
7c10: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
7c20: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
7c30: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
7c40: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
7c50: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
7c60: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
7c70: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
7c80: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
7c90: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
7ca0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
7cb0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
7cc0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
7cd0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
7ce0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
7cf0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
7d00: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
7d10: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
7d20: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
7d30: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
7d40: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
7d50: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
7d60: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
7d70: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
7d80: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
7d90: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
7da0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
7db0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
7dc0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
7dd0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
7de0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
7df0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
7e00: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
7e10: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
7e20: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
7e30: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
7e40: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
7e50: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
7e60: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
7e70: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
7e80: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
7e90: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
7ea0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
7eb0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
7ec0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
7ed0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
7ee0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
7ef0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
7f00: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
7f10: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
7f20: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
7f30: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
7f40: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
7f50: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
7f60: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
7f70: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
7f80: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
7f90: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
7fa0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
7fb0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
7fc0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
7fd0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
7fe0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
7ff0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8000: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8010: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8020: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8030: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8040: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8050: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8060: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8070: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8080: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8090: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
80a0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
80b0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
80c0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
80d0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
80e0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
80f0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8100: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8110: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8120: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8130: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8140: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8150: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8160: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8170: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8180: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8190: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
81a0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
81b0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
81c0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
81d0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
81e0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
81f0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8200: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8210: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8220: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8230: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8240: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8250: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8260: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8270: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8280: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8290: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
82a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
82b0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
82c0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
82d0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
82e0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
82f0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8300: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8310: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8320: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8330: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8340: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8350: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8360: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8370: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8380: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8390: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
83a0: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
83b0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
83c0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
83d0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
83e0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
83f0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8400: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8410: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8420: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8430: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8440: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8450: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8470: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8480: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8490: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
84a0: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
84b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
84c0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
84d0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
84e0: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
84f0: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
8500: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
8510: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
8520: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
8530: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
8540: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
8550: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
8560: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
8570: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
8580: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
8590: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
85a0: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
85b0: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
85c0: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
85d0: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
85e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
85f0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
8600: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
8610: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
8620: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
8630: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
8640: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
8650: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
8660: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
8670: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
8680: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
8690: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
86a0: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
86b0: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
86c0: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
86d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
86e0: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
86f0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
8700: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
8710: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
8720: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
8730: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
8740: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
8750: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
8760: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
8770: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
8780: 73 28 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23  s(v,w,x,y,z) 0.#
8790: 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65   define pagerOpe
87a0: 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29  nWalIfPresent(z)
87b0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
87c0: 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65  ine pagerBeginRe
87d0: 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29  adTransaction(z)
87e0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
87f0: 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f..#ifndef NDEBU
8800: 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a  G ./*.** Usage:.
8810: 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20  **.**   assert( 
8820: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
8830: 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a  te(pPager) );.**
8840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8850: 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65  n runs many asse
8860: 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69  rts to try to fi
8870: 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69  nd inconsistenci
8880: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74  es in.** the int
8890: 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
88a0: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
88b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
88c0: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
88d0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50  e(Pager *p){.  P
88e0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
88f0: 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75  ;..  /* State mu
8900: 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a  st be valid. */.
8910: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
8920: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a  ate==PAGER_OPEN.
8930: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
8940: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
8950: 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  R.       || p->e
8960: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
8970: 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
8980: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
8990: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
89a0: 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
89b0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
89c0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
89d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
89e0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
89f0: 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20  FINISHED.       
8a00: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
8a10: 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a  GER_ERROR.  );..
8a20: 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20    /* Regardless 
8a30: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
8a40: 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c  tate, a temp-fil
8a50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77  e connection alw
8a60: 61 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a  ays behaves.  **
8a70: 20 61 73 20 69 66 20 69 74 20 68 61 73 20 61 6e   as if it has an
8a80: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
8a90: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
8aa0: 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75  file. It never u
8ab0: 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  pdates.  ** the 
8ac0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
8ad0: 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61  ield, so the cha
8ae0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
8af0: 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e  g is always set.
8b00: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8b10: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
8b20: 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  | p->eLock==EXCL
8b30: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
8b40: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
8b50: 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
8b60: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
8b70: 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e );..  /* If th
8b80: 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61  e useJournal fla
8b90: 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20  g is clear, the 
8ba0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73  journal-mode mus
8bb0: 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a  t be "OFF". .  *
8bc0: 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75  * And if the jou
8bd0: 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46  rnal-mode is "OF
8be0: 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  F", the journal 
8bf0: 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  file must not be
8c00: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73   open..  */.  as
8c10: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
8c20: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8c30: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70  NALMODE_OFF || p
8c40: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
8c50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
8c60: 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
8c70: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
8c80: 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  || !isOpen(p->jf
8c90: 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  d) );..  /* Chec
8ca0: 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70  k that MEMDB imp
8cb0: 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 2a 2f 0a  lies noSync. */.
8cc0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
8cd0: 20 7c 7c 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b   || p->noSync );
8ce0: 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65  ..  /* If change
8cf0: 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74  CountDone is set
8d00: 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  , a RESERVED loc
8d10: 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
8d20: 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f  t be held.  ** o
8d30: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  n the file..  */
8d40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8d50: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
8d60: 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ne==0 || pPager-
8d70: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
8d80: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
8d90: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e  t( p->eLock!=PEN
8da0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  DING_LOCK );..  
8db0: 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74  switch( p->eStat
8dc0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
8dd0: 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20  GER_OPEN:.      
8de0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
8df0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8e00: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8e10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8e20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8e30: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
8e40: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
8e50: 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  e)==0 || pPager-
8e60: 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
8e70: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
8e80: 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52  ase PAGER_READER
8e90: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
8ea0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8eb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8ec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
8ed0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
8ee0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
8ef0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  rt( p->eLock>=SH
8f00: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e  ARED_LOCK || p->
8f10: 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20  noReadlock );.  
8f20: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
8f30: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
8f40: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
8f50: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
8f60: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
8f70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f80: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8f90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8fa0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
8fb0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
8fc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8fd0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
8fe0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
8ff0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9000: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9010: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9020: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9030: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9040: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9050: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9070: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
9080: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
9090: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
90a0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
90b0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
90c0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
90d0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
90e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
90f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9100: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9110: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9120: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9130: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
9140: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
9150: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
9160: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
9170: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
9180: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
9190: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
91a0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
91b0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
91c0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
91d0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
91e0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
91f0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
9200: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
9210: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
9220: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9230: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9240: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9250: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
9260: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
9270: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
9280: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9290: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
92a0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
92b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
92c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
92d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
92e0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
92f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9300: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9310: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9320: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
9330: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9340: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9350: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
9360: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
9370: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9380: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9390: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
93a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
93b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
93c0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
93d0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
93e0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
93f0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
9400: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
9410: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
9420: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9430: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9440: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9450: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9460: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9470: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9480: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
9490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
94a0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
94b0: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
94c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
94d0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
94e0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
94f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
9500: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
9510: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9520: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9530: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
9540: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
9550: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
9560: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9570: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9580: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9590: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
95a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
95b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
95c0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
95d0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
95e0: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
95f0: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
9600: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
9610: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
9620: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
9630: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
9640: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
9650: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
9660: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
9670: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
9680: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
9690: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
96a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
96b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
96c0: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
96d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
96e0: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
96f0: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
9700: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
9710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9720: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
9730: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
9740: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
9750: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
9760: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
9770: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
9780: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
9790: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
97a0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
97b0: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
97c0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
97d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
97e0: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
97f0: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
9800: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
9810: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
9820: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
9830: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
9840: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
9850: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
9860: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
9870: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9880: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
9890: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
98a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
98b0: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
98c0: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
98d0: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
98e0: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
98f0: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
9900: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
9910: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
9920: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
9930: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
9940: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
9950: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
9960: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
9970: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
9980: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
9990: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
99a0: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
99b0: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
99c0: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
99d0: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
99e0: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
99f0: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
9a00: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
9a10: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
9a20: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
9a30: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
9a40: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
9a50: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
9a60: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
9a70: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9a80: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
9a90: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
9aa0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
9ab0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9ac0: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
9ad0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
9ae0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
9af0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9b00: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
9b10: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
9b20: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
9b30: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9b40: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
9b50: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
9b60: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
9b70: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
9b80: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
9b90: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
9ba0: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
9bb0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
9bc0: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
9bd0: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
9be0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
9bf0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20  =RESERVED_LOCK  
9c00: 20 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a   ? "RESERVED" :.
9c10: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
9c20: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9c30: 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20    ? "EXCLUSIVE" 
9c40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
9c50: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
9c60: 20 20 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a      ? "SHARED" :
9c70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
9c80: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
9c90: 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a     ? "UNKNOWN" :
9ca0: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
9cb0: 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d   , p->exclusiveM
9cc0: 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65  ode ? "exclusive
9cd0: 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20  " : "normal".   
9ce0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d     , p->journalM
9cf0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d00: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
9d10: 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20  ? "memory" :.   
9d20: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
9d30: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d40: 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
9d50: 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20  ? "off" :.      
9d60: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
9d70: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9d80: 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22  ODE_DELETE   ? "
9d90: 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20  delete" :.      
9da0: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
9db0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9dc0: 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22  ODE_PERSIST  ? "
9dd0: 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20  persist" :.     
9de0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
9df0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9e00: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20  MODE_TRUNCATE ? 
9e10: 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20  "truncate" :.   
9e20: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
9e30: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e40: 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20  ALMODE_WAL      
9e50: 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f  ? "wal" : "?erro
9e60: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
9e70: 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69  )p->tempFile, (i
9e80: 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e  nt)p->memDb, (in
9e90: 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  t)p->useJournal.
9ea0: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
9eb0: 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61  alOff, p->journa
9ec0: 6c 48 64 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  lHdr.  );..  ret
9ed0: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
9ee0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
9ef0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
9f00: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
9f10: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
9f20: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
9f30: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
9f40: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
9f50: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
9f60: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
9f70: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
9f80: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
9f90: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
9fa0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
9fb0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
9fc0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
9fd0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
9fe0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
9ff0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
a000: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
a010: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
a020: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
a030: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
a040: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
a050: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
a060: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
a070: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
a080: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
a090: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
a0a0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
a0b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
a0c0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
a0d0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
a0e0: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
a0f0: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
a100: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
a110: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
a120: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
a130: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
a140: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
a150: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
a160: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
a170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
a180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a190: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
a1a0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
a1b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a1c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a1d0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
a1e0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
a1f0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
a200: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
a210: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
a220: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
a230: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
a240: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
a250: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
a260: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
a270: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
a280: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
a290: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
a2a0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
a2b0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
a2c0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
a2d0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
a2e0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
a2f0: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
a300: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
a310: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
a320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
a330: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
a340: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
a350: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
a360: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
a370: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
a380: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a390: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
a3a0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
a3b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a3c0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
a3d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
a3e0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
a3f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a400: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
a410: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
a420: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
a430: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
a440: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
a450: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
a460: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
a470: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a  e((u8*)A,B).../*
a480: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
a490: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
a4a0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
a4b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
a4c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
a4d0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
a4e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
a4f0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
a500: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
a510: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
a520: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
a530: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
a540: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
a550: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
a560: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
a570: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
a580: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
a590: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
a5a0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
a5b0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
a5c0: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
a5d0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
a5e0: 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52  _LOCK.** or SHAR
a5f0: 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c  ED_LOCK. Regardl
a600: 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
a610: 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74  r not the call t
a620: 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73  o xUnlock().** s
a630: 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65  ucceeds, set the
a640: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
a650: 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74  iable to match t
a660: 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e  he (attempted) n
a670: 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45  ew lock..**.** E
a680: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
a690: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
a6a0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
a6b0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
a6c0: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  is.** called, do
a6d0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20   not modify it. 
a6e0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
a6f0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
a700: 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e  e of .** UNKNOWN
a710: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
a720: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  lanation of this
a730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a740: 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61  pagerUnlockDb(Pa
a750: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
a760: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
a770: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
a780: 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
a790: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
a7a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
a7b0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
a7c0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
a7d0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a7e0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
a7f0: 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
a800: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ager)==0 );.  if
a810: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
a820: 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
a830: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
a840: 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k>=eLock );.    
a850: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
a860: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
a870: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
a880: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
a890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
a8a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
a8b0: 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 20  ock = eLock;.   
a8c0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
a8d0: 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  "UNLOCK %p %d\n"
a8e0: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
a8f0: 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ).  }.  return r
a900: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
a910: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a920: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
a930: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
a940: 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c   either SHARED_L
a950: 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44  OCK,.** RESERVED
a960: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
a970: 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20  VE_LOCK. If the 
a980: 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73  caller is succes
a990: 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a  sful, set the.**
a9a0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
a9b0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77  iable to the new
a9c0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20   locking state. 
a9d0: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
a9e0: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
a9f0: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
aa00: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
aa10: 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63  unction is .** c
aa20: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
aa30: 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74  dify it unless t
aa40: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
aa50: 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56  tate is EXCLUSIV
aa60: 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20  E_LOCK. .** See 
aa70: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
aa80: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
aa90: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
aaa0: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
aab0: 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f   .** of this..*/
aac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
aad0: 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  rLockDb(Pager *p
aae0: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
aaf0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ab00: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
ab10: 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  rt( eLock==SHARE
ab20: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
ab30: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
ab40: 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  | eLock==EXCLUSI
ab50: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
ab60: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65   pPager->eLock<e
ab70: 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Lock || pPager->
ab80: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
ab90: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
aba0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
abb0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
abc0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
abd0: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67  LITE_OK && (pPag
abe0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
abf0: 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d  WN_LOCK||eLock==
ac00: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
ac10: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ac20: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
ac30: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
ac40: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
ac50: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
ac60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ac70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
ac80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
ac90: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
aca0: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
acb0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
acc0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
acd0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
ace0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
acf0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
ad00: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
ad10: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
ad20: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
ad30: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
ad40: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
ad50: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
ad60: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
ad70: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
ad80: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
ad90: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
ada0: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
adb0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
adc0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
add0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
ade0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
adf0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
ae00: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
ae10: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
ae20: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
ae30: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
ae40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ae50: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
ae60: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
ae70: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
ae80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
ae90: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
aea0: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
aeb0: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
aec0: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
aed0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
aee0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
aef0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
af00: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
af10: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
af20: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
af30: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
af40: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
af50: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
af60: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
af70: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
af80: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
af90: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
afa0: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
afb0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
afc0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
aff0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
b000: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
b030: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
b040: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b060: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
b070: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
b080: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
b090: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
b0a0: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
b0b0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
b0c0: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
b0d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
b0e0: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
b0f0: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
b100: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
b110: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
b120: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
b130: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
b140: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
b150: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
b160: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
b170: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
b180: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
b190: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
b1a0: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
b1b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
b1c0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
b1d0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
b1e0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
b1f0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
b200: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b210: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
b220: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
b230: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
b240: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
b250: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
b260: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
b270: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
b280: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
b290: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
b2a0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
b2b0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
b2c0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
b2d0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
b2e0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
b2f0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
b300: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
b310: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
b320: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
b330: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
b340: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
b350: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
b360: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
b370: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
b380: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
b390: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
b3a0: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
b3b0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
b3c0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
b3d0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
b3e0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
b3f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b400: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
b410: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
b420: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
b430: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
b440: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
b450: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
b460: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
b470: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
b480: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
b490: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
b4a0: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
b4b0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
b4c0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
b4d0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
b4e0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
b4f0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
b500: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
b510: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
b520: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
b530: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
b540: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
b550: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
b560: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
b570: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
b580: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
b590: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
b5a0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
b5b0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
b5c0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
b5d0: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
b5e0: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
b5f0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20  rrCode.      || 
b600: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
b610: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
b620: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
b630: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
b640: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
b650: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
b660: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
b670: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
b680: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
b690: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
b6a0: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
b6b0: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
b6c0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
b6d0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
b6e0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
b6f0: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
b700: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73  be open..** This
b710: 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
b720: 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73  ts to read a mas
b730: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b740: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a   name from the .
b750: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
b760: 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65  le and, if succe
b770: 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74  ssful, copies it
b780: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
b790: 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65  plied .** by the
b7a0: 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d   caller. See com
b7b0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74  ments above writ
b7c0: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
b7d0: 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a   for the format.
b7e0: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
b7f0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
b800: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74  l file name at t
b810: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
b820: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
b830: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
b840: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
b850: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
b860: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
b870: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
b880: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
b890: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
b8a0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
b8b0: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
b8c0: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
b8d0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
b8e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
b8f0: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
b900: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
b910: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
b920: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
b930: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
b940: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
b950: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
b960: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
b970: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
b980: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b990: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
b9a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
b9b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74  .**.** If a mast
b9c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
b9d0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
b9e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
b9f0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
ba00: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  e, then it is co
ba10: 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75  pied into the bu
ba20: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
ba30: 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a  by zMaster. A.**
ba40: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
ba50: 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64  byte is appended
ba60: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66   to the buffer f
ba70: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73  ollowing the mas
ba80: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
ba90: 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile name..**.** 
baa0: 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69  If it is determi
bab0: 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74  ned that no mast
bac0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
bad0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
bae0: 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  .** zMaster[0] i
baf0: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
bb00: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
bb10: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
bb20: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
bb30: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
bb40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
bb50: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
bb60: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
bb70: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
bb80: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
bb90: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
bba0: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
bbb0: 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d  *zMaster, u32 nM
bbc0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
bbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bbe0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
bbf0: 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  ode */.  u32 len
bc00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc10: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e      /* Length in
bc20: 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72   bytes of master
bc30: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
bc40: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc60: 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62   Total size in b
bc70: 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ytes of journal 
bc80: 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20  file pJrnl */.  
bc90: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
bca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a             /* MJ
bcb0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
bcc0: 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  read from journa
bcd0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
bd00: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bd10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
bd20: 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20  agic[8];   /* A 
bd30: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
bd40: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
bd50: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  */.  zMaster[0] 
bd60: 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53  = '\0';..  if( S
bd70: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
bd80: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
bd90: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a  e(pJrnl, &szJ)).
bda0: 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20     || szJ<16.   
bdb0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
bdc0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
bdd0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
bde0: 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d  en)).   || len>=
bdf0: 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53  nMaster .   || S
be00: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
be10: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
be20: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
be30: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
be40: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
be50: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
be60: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
be70: 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  ).   || memcmp(a
be80: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
be90: 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53  agic, 8).   || S
bea0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
beb0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
bec0: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
bed0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a  n, szJ-16-len)).
bee0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
bef0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
bf00: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
bf10: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
bf20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
bf30: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
bf40: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
bf50: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
bf60: 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r[u];.  }.  if( 
bf70: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
bf80: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
bf90: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
bfa0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
bfb0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
bfc0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
bfd0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
bfe0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
bff0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
c000: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
c010: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
c020: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
c030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c040: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
c050: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
c060: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
c070: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
c080: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  len = 0;.  }.  z
c090: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
c0a0: 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e  0';.   .  return
c0b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c0c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c0d0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65  offset of the se
c0e0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74  ctor boundary at
c0f0: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   or immediately 
c100: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
c110: 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65  e value in pPage
c120: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61  r->journalOff, a
c130: 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72  ssuming a sector
c140: 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61   .** size of pPa
c150: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
c160: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  bytes..**.** i.e
c170: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
c180: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
c190: 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c     Pager.journal
c1a0: 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74  Off          Ret
c1b0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d  urn value.**   -
c1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1e0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32        0.**   512
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
c230: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
c240: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
c250: 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20     2000         
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
c270: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
c280: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
c290: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
c2a0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
c2b0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
c2c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c2d0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
c2e0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
c2f0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
c300: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
c310: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
c320: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
c330: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
c340: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c350: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
c360: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
c370: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
c380: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
c390: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
c3a0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
c3b0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
c3c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
c3d0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
c3e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c3f0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
c400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
c410: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f   no-op if the jo
c420: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e  urnal file has n
c430: 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ot been written 
c440: 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  to.** within the
c450: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
c460: 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61  tion (i.e. if Pa
c470: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  ger.journalOff==
c480: 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54  0)..**.** If doT
c490: 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a  runcate is non-z
c4a0: 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72  ero or the Pager
c4b0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
c4c0: 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  t variable is.**
c4d0: 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20   set to 0, then 
c4e0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
c4f0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72  rnal file to zer
c500: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
c510: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a   Otherwise,.** z
c520: 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20  ero the 28-byte 
c530: 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74  header at the st
c540: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
c550: 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68  al file. In eith
c560: 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20  er case, .** if 
c570: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
c580: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
c590: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
c5a0: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
c5b0: 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72  ely .** after wr
c5c0: 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  iting or truncat
c5d0: 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ing it..**.** If
c5e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
c5f0: 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74  zeLimit is set t
c600: 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f  o a positive, no
c610: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e  n-zero value, an
c620: 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  d.** following t
c630: 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72  he truncation or
c640: 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62   zeroing describ
c650: 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a  ed above the siz
c660: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75  e of the .** jou
c670: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
c680: 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  es is larger tha
c690: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68  n this value, th
c6a0: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  en truncate the.
c6b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
c6c0: 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  to Pager.journal
c6d0: 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e  SizeLimit bytes.
c6e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c6f0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65  e does.** not ne
c700: 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20  ed to be synced 
c710: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
c720: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
c730: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
c740: 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70  ccurs, abandon p
c750: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
c760: 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  turn the IO erro
c770: 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72  r code..** Other
c780: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  wise, return SQL
c790: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
c7a0: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
c7b0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
c7c0: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
c7d0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
c7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
c810: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
c820: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
c830: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66  er->jfd) );.  if
c840: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c850: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73  lOff ){.    cons
c860: 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70  t i64 iLimit = p
c870: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
c880: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c  zeLimit;    /* L
c890: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73  ocal cache of js
c8a0: 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43  l */..    IOTRAC
c8b0: 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c  E(("JZEROHDR %p\
c8c0: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
c8d0: 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20   if( doTruncate 
c8e0: 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  || iLimit==0 ){.
c8f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c900: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
c910: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
c920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
c930: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c940: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b   zeroHdr[28] = {
c950: 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0};.      rc = s
c960: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
c970: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
c980: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
c990: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
c9a0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c9b0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
c9c0: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
c9d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
c9e0: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
c9f0: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
ca00: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
ca10: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
ca20: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
ca30: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
ca40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
ca50: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
ca60: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
ca70: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
ca80: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
ca90: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
caa0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
cab0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
cac0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
cad0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
cae0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
caf0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
cb00: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
cb10: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
cb20: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
cb30: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
cb40: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
cb50: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
cb60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
cb70: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
cb80: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
cb90: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
cba0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
cbb0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
cbc0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
cbd0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
cbe0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
cbf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
cc00: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
cc10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cc20: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
cc30: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
cc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cc50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cc60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
cc70: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
cc80: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
cc90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
cca0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
ccb0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
ccc0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
ccd0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
cce0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ccf0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
cd00: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
cd10: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
cd20: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
cd30: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
cd40: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
cd50: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
cd60: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
cd70: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
cd80: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
cd90: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
cda0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
cdb0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
cdc0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
cdd0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
cde0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
cdf0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
ce00: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
ce10: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
ce20: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
ce30: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
ce40: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
ce50: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
ce60: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
ce70: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
ce80: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
ce90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
cea0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
ceb0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
cec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
ced0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
cee0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
cef0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cf00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cf10: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
cf20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
cf30: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
cf40: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
cf50: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
cf60: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
cf70: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
cf80: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  er = pPager->pag
cf90: 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69  eSize;     /* Si
cfa0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
cfb0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
cfc0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
cfd0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cff0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
d000: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
d010: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d040: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
d050: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
d060: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
d070: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
d080: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
d090: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
d0a0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
d0b0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
d0c0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
d0d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
d0e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d0f0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
d100: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
d110: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
d120: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
d130: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
d140: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
d150: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
d160: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
d170: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
d180: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
d190: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
d1a0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
d1b0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
d1c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
d1d0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
d1e0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
d1f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
d200: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
d210: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
d220: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d230: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
d240: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
d250: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
d260: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
d270: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
d280: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
d290: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
d2a0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
d2b0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
d2c0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
d2d0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
d2e0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
d2f0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
d300: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
d310: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
d320: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
d330: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
d340: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
d350: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
d360: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
d370: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
d380: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
d390: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
d3a0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
d3b0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
d3c0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
d3d0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
d3e0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
d3f0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
d400: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
d410: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
d420: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
d430: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
d440: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
d450: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
d460: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
d470: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d480: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
d490: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
d4a0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
d4b0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
d4c0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
d4d0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
d4e0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
d4f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
d500: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
d510: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
d520: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
d530: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
d540: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
d550: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
d560: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
d570: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
d580: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
d590: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
d5a0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
d5b0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
d5c0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
d5d0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
d5e0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
d5f0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
d600: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
d610: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
d620: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
d630: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
d640: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
d650: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
d660: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
d670: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
d680: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
d690: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
d6a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
d6b0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
d6c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
d6d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
d6e0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
d6f0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
d700: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
d710: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
d720: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
d730: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
d740: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
d750: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
d760: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
d770: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
d780: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
d790: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
d7a0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
d7b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
d7c0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
d7d0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
d7e0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
d7f0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
d800: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
d810: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
d820: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
d830: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
d840: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
d850: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
d860: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
d870: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
d880: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
d890: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d8a0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
d8b0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
d8c0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
d8d0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
d8e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
d8f0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
d900: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
d910: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
d920: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
d930: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
d940: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
d950: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
d960: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
d970: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
d980: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
d990: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
d9a0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
d9b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
d9c0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
d9d0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
d9e0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
d9f0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
da00: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
da10: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
da20: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
da30: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
da40: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
da50: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
da60: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
da70: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
da80: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
da90: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
daa0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
dab0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
dac0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
dad0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
dae0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
daf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
db00: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
db10: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
db20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
db30: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
db40: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
db50: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
db60: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
db70: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
db80: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
db90: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
dba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
dbb0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
dbc0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
dbd0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
dbe0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
dbf0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
dc00: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
dc10: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
dc20: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
dc30: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
dc40: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
dc50: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
dc60: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
dc70: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
dc80: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
dc90: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
dca0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
dcb0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
dcc0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
dcd0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
dce0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
dcf0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
dd00: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
dd10: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
dd20: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
dd30: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
dd40: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
dd50: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
dd60: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
dd70: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dd80: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
dd90: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
dda0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
ddb0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
ddc0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
ddd0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
dde0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ddf0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
de00: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
de10: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
de20: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
de30: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
de40: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
de50: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
de60: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
de70: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
de80: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
de90: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
dea0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
deb0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
dec0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
ded0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
dee0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
def0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
df00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
df10: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
df20: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
df30: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
df40: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
df50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
df60: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
df70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
df80: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
df90: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
dfa0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
dfb0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
dfc0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
dfd0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
dfe0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
dff0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
e000: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
e010: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
e020: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
e030: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
e040: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
e050: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
e060: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
e070: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
e080: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
e090: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
e0a0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
e0b0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
e0c0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
e0d0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
e0e0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
e0f0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
e100: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
e110: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
e120: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
e130: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
e140: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
e150: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
e160: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e170: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
e180: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
e190: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
e1a0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
e1b0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
e1c0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
e1d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
e1e0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
e1f0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
e200: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
e210: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
e220: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e230: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
e240: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
e250: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
e260: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
e270: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
e280: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
e290: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
e2a0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
e2b0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
e2c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
e2d0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
e2e0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
e2f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
e300: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
e310: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
e320: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
e330: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
e340: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
e350: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
e360: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
e370: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
e380: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
e390: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
e3a0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
e3b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
e3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
e3d0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
e3e0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
e3f0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
e400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e410: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
e420: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
e430: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
e440: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
e450: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
e460: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
e470: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
e480: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4a0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
e4b0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
e4c0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
e4d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e500: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
e510: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
e520: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
e530: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
e540: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
e550: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
e560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
e570: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
e580: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
e590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
e5a0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
e5b0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
e5c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e5d0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
e5e0: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
e5f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
e600: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
e610: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
e620: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
e630: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
e640: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
e650: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
e660: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
e670: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
e680: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
e690: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e6a0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
e6b0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
e6c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
e6d0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
e6e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e6f0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
e700: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e710: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
e720: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
e730: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
e740: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
e750: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
e760: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e770: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
e780: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
e790: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
e7a0: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
e7b0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
e7c0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
e7d0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
e7e0: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
e7f0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
e800: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
e810: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
e820: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
e830: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
e840: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
e850: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
e860: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
e870: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
e880: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
e890: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
e8a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
e8b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e8c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e8d0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
e8e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e8f0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
e900: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
e910: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
e920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
e930: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
e940: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
e950: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e960: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
e970: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
e980: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
e990: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
e9a0: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
e9b0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
e9c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e9d0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
e9e0: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
e9f0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
ea00: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
ea10: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
ea20: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
ea30: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
ea40: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
ea50: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
ea60: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ea70: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
ea80: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
ea90: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
eaa0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
eab0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
eac0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
ead0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
eae0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
eaf0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
eb00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
eb10: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
eb20: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
eb30: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
eb40: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
eb50: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
eb60: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb80: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
eb90: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
eba0: 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69  der */.    u16 i
ebb0: 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20  PageSize16;     
ebc0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
ebd0: 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20  of iPageSize in 
ebe0: 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20  16-bit variable 
ebf0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
ec00: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
ec10: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f  d sector-size jo
ec20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65  urnal header fie
ec30: 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  lds. */.    if( 
ec40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ec50: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ec60: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ec70: 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +20, &iSectorSiz
ec80: 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  e)).     || SQLI
ec90: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
eca0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ecb0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c  jfd, iHdrOff+24,
ecc0: 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20   &iPageSize)).  
ecd0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
ece0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
ecf0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
ed00: 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66  he values read f
ed10: 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a  rom the page-siz
ed20: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
ed30: 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20  e fields.    ** 
ed40: 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
ed50: 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67  . To be 'in rang
ed60: 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20  e', both values 
ed70: 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  need to be a pow
ed80: 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f  er.    ** of two
ed90: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
eda0: 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72   equal to 512 or
edb0: 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65   32, and not gre
edc0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20  ater than their 
edd0: 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69  .    ** respecti
ede0: 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  ve compile time 
edf0: 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a  maximum limits..
ee00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
ee10: 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20  PageSize<512    
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
ee30: 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a   iSectorSize<32.
ee40: 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a       || iPageSiz
ee50: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
ee60: 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f  E_SIZE || iSecto
ee70: 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
ee80: 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28  _SIZE.     || ((
ee90: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
eea0: 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20  geSize)!=0   || 
eeb0: 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29  ((iSectorSize-1)
eec0: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30  &iSectorSize)!=0
eed0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
eee0: 2a 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20  * If the either 
eef0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72  the page-size or
ef00: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
ef10: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
ef20: 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  er is .      ** 
ef30: 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68  invalid, then th
ef40: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
ef50: 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rote the journal
ef60: 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76  -header must hav
ef70: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73  e .      ** cras
ef80: 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68  hed before the h
ef90: 65 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64  eader was synced
efa0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  . In this case s
efb0: 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20  top reading .   
efc0: 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
efd0: 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  l file here..   
efe0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
eff0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70      }..    /* Up
f010: 64 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69  date the page-si
f020: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
f030: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
f040: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  the journal. .  
f050: 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63    ** Use a testc
f060: 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d  ase() macro to m
f070: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61  ake sure that ma
f080: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74  lloc failure wit
f090: 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  hin .    ** Page
f0a0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69  rSetPagesize() i
f0b0: 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f  s tested..    */
f0c0: 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65 31 36  .    iPageSize16
f0d0: 20 3d 20 28 75 31 36 29 69 50 61 67 65 53 69 7a   = (u16)iPageSiz
f0e0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
f0f0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
f100: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
f110: 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b 0a 20  geSize16, -1);. 
f120: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
f130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
f140: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f150: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65  LITE_OK || iPage
f160: 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61  Size16==(u16)iPa
f170: 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
f180: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
f190: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
f1a0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
f1b0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20  lue used by .   
f1c0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
f1d0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
f1e0: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
f1f0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
f200: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79     ** created by
f210: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
f220: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
f230: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
f240: 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e  e.    ** is bein
f250: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
f260: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
f270: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
f280: 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
f290: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
f2a0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
f2b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
f2c0: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
f2d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
f2e0: 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f  torSize = iSecto
f2f0: 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50  rSize;.  }..  pP
f300: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f310: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
f320: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
f330: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
f340: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
f350: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
f360: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
f370: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f380: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
f390: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
f3a0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
f3b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f3c0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
f3d0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
f3e0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
f3f0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
f400: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
f410: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
f420: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
f430: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
f440: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
f450: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
f460: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
f470: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
f480: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
f490: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79  :.**.**   + 4 by
f4a0: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
f4b0: 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74  NO..**   + N byt
f4c0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
f4d0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75  al filename in u
f4e0: 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tf-8..**   + 4 b
f4f0: 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20  ytes: N (length 
f500: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
f510: 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c  l name in bytes,
f520: 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   no nul-terminat
f530: 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  or)..**   + 4 by
f540: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
f550: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
f560: 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65  m..**   + 8 byte
f570: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
f580: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
f590: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
f5a0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
f5b0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
f5c0: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
f5d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
f5e0: 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74  , where each byt
f5f0: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
f600: 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62   as a signed 8-b
f610: 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
f620: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
f630: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
f640: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
f650: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
f660: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
f670: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
f680: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
f690: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
f6a0: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
f6b0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
f6c0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
f6d0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f6f0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f700: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20    int nMaster;  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
f730: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
f740: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
f770: 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72  f header in jour
f780: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
f790: 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20  4 jrnlSize;     
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f7b0: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
f7c0: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a  l file on disk *
f7d0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  /.  u32 cksum = 
f7e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
f7f0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
f800: 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
f810: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
f820: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
f830: 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er==0 );.  asser
f840: 74 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  t( !zMaster || p
f850: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
f860: 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
f870: 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 20 20 61  LMODE_WAL );.  a
f880: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
f890: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
f8a0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
f8b0: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
f8c0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
f8d0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
f8e0: 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ORY .   || pPage
f8f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
f900: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
f910: 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20  E_OFF .  ){.    
f920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f930: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
f940: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
f950: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
f960: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
f970: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f980: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
f990: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f9a0: 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63  ff );..  /* Calc
f9b0: 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68  ulate the length
f9c0: 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68   in bytes and th
f9d0: 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d  e checksum of zM
f9e0: 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e  aster */.  for(n
f9f0: 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65  Master=0; zMaste
fa00: 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73  r[nMaster]; nMas
fa10: 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ter++){.    cksu
fa20: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  m += zMaster[nMa
fa30: 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster];.  }..  /*
fa40: 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
fa50: 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74   mode, advance t
fa60: 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20  o the next disk 
fa70: 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72  sector before wr
fa80: 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  iting.  ** the m
fa90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
faa0: 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63  me. This is in c
fab0: 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
fac0: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f   page written to
fad0: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
fae0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  l has already be
faf0: 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a  en synced..  */.
fb00: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
fb10: 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
fb20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fb30: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
fb40: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
fb50: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
fb60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
fb70: 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
fb80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fb90: 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20  data to the end 
fba0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
fbb0: 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ile. If.  ** an 
fbc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
fbd0: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
fbe0: 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
fbf0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30  r..  */.  if( (0
fc00: 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
fc10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fc20: 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45  d, iHdrOff, PAGE
fc30: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
fc40: 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  )))).   || (0 !=
fc50: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
fc60: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
fc70: 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73  d, zMaster, nMas
fc80: 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29  ter, iHdrOff+4))
fc90: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
fca0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
fcb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fcc0: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20  rOff+4+nMaster, 
fcd0: 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c  nMaster))).   ||
fce0: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
fcf0: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
fd00: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
fd10: 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d  nMaster+4, cksum
fd20: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
fd30: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
fd40: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
fd50: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
fd60: 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d   8, iHdrOff+4+nM
fd70: 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
fd80: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fd90: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
fda0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
fdb0: 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
fdc0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
fdd0: 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
fde0: 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
fdf0: 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
fe00: 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
fe10: 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
fe20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
fe30: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
fe40: 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
fe50: 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
fe60: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
fe70: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
fe80: 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
fe90: 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
fea0: 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
feb0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
fec0: 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
fed0: 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
fee0: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
fef0: 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
ff00: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
ff10: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
ff20: 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
ff30: 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
ff40: 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
ff50: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
ff60: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
ff70: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
ff80: 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
ff90: 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
ffa0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
ffb0: 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
ffc0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
ffd0: 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
ffe0: 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
fff0: 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
10000 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
10010 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
10020 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
10030 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
10040 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
10050 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10060 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
10070 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
10080 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
10090 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  mber. Return.** 
100a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
100b0 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
100c0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
100d0 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  age is not .** a
100e0 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79  lready in memory
100f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
10100 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
10110 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
10120 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
10130 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10150 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
10160 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  /..  /* It is no
10170 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
10180 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46   call to PcacheF
10190 65 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61  etch() with crea
101a0 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a  teFlag==0 to.  *
101b0 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f  * fail, since no
101c0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
101d0 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d  cate dynamic mem
101e0 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  ory will be made
101f0 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73  ..  */.  (void)s
10200 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
10210 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
10220 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b  e, pgno, 0, &p);
10230 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
10240 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68  /*.** Discard th
10250 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
10260 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  s of the in-memo
10270 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a  ry page-cache..*
10280 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
10290 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
102a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
102b0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
102c0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
102d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
102e0 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
102f0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
10300 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
10310 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
10320 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
10330 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
10340 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
10350 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
10360 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
10370 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
10380 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
10390 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
103a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
103b0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
103c0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
103d0 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
103e0 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a  vepoints(Pager *
103f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
10400 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
10410 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
10420 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
10430 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
10440 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  t */.  for(ii=0;
10450 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
10460 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
10470 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
10480 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
10490 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
104a0 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
104b0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
104c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
104d0 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  | sqlite3IsMemJo
104e0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a  urnal(pPager->sj
104f0 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fd) ){.    sqlit
10500 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
10510 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->sjfd);.  }.  s
10520 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
10530 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b  er->aSavepoint);
10540 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  .  pPager->aSave
10550 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
10560 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
10570 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
10580 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  SubRec = 0;.}../
10590 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
105a0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
105b0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
105c0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
105d0 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61  .** bitvecs of a
105e0 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
105f0 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ts. Return SQLIT
10600 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
10610 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ul.** or SQLITE_
10620 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
10630 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
10640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10650 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
10660 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
10670 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
10680 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
106b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
106c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
106d0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
106e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
106f0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
10700 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
10710 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
10720 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
10730 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
10740 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
10750 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
10760 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
10770 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
10780 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74  , pgno);.      t
10790 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
107a0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
107b0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
107c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
107d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
107e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
107f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10800 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
10810 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 66  ase file. This f
10820 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
10830 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72 0a  op if the pager.
10840 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  ** is in exclusi
10850 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  ve mode..**.** I
10860 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
10870 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f  urrently in erro
10880 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64  r state, discard
10890 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
108a0 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61   .** the cache a
108b0 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67  nd reset the Pag
108c0 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  er structure int
108d0 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20  ernal state. If 
108e0 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f  there is.** an o
108f0 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  pen journal-file
10900 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20  , then the next 
10910 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f  time a shared-lo
10920 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ck is obtained.*
10930 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66  * on the pager f
10940 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20  ile (by this or 
10950 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
10960 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a  s), it will be.*
10970 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68  * treated as a h
10980 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72  ot-journal and r
10990 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
109a0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
109b0 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
109c0 50 61 67 65 72 29 7b 0a 0a 20 20 73 71 6c 69 74  Pager){..  sqlit
109d0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
109e0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
109f0 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
10a00 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
10a10 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
10a20 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
10a30 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
10a40 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
10a50 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
10a60 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
10a70 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
10a80 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
10a90 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
10aa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
10ab0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
10ac0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
10ad0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
10ae0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
10af0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
10b10 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
10b20 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
10b30 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
10b40 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
10b50 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
10b60 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
10b70 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
10b80 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
10b90 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
10ba0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
10bb0 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
10bc0 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
10bd0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
10be0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
10bf0 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
10c00 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
10c10 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
10c20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
10c30 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
10c40 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
10c50 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
10c60 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
10c70 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
10c80 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
10c90 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
10ca0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
10cb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
10cc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10cd0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
10ce0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
10cf0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
10d00 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
10d10 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
10d20 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
10d30 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
10d40 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
10d50 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
10d60 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
10d70 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
10d80 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
10d90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
10da0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
10db0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
10dc0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
10dd0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
10de0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
10df0 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
10e00 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
10e10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10e20 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
10e30 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
10e40 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
10e50 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
10e60 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
10e70 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
10e80 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
10e90 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
10ea0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10eb0 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
10ec0 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
10ed0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
10ee0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
10ef0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
10f00 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
10f10 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
10f20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
10f30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
10f40 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
10f50 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
10f60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10f70 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
10f80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
10f90 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
10fa0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
10fb0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
10fc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
10fd0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
10fe0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
10ff0 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
11000 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
11010 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
11020 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
11030 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
11040 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
11050 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
11060 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
11070 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
11080 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
11090 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
110a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
110b0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
110c0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
110d0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
110e0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
110f0 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
11100 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
11110 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
11120 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
11130 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
11140 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
11150 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11160 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
11170 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
11180 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
11190 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
111a0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
111b0 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
111c0 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
111d0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
111e0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
111f0 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
11200 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
11210 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
11220 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
11230 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
11240 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61  !MEMDB ){.    pa
11250 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
11260 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
11270 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
11280 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
11290 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
112a0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
112b0 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
112c0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
112d0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
112e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
112f0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
11300 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
11310 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
11320 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
11330 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
11340 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
11350 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
11360 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
11370 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
11380 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
11390 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
113a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
113b0 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
113c0 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
113d0 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
113e0 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
113f0 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
11400 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
11410 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
11420 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
11430 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
11440 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
11450 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
11460 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
11470 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
11480 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
11490 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
114a0 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
114b0 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
114c0 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
114d0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
114e0 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64  error is cleared
114f0 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20  ,.** subsequent 
11500 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
11510 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  s Pager will imm
11520 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
11530 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72  the same .** err
11540 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  or code..**.** A
11550 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
11560 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
11570 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
11580 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
11590 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
115a0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
115b0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
115c0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
115d0 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
115e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
115f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
11600 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
11610 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
11620 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
11630 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
11640 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
11650 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
11660 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
11670 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
11680 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
11690 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
116a0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
116b0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
116c0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
116d0 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
116e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
116f0 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
11700 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
11710 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
11720 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
11730 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
11740 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
11750 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
11760 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
11770 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
11780 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
11790 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
117a0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
117b0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
117c0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
117d0 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
117e0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
117f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11800 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
11810 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
11820 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
11830 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11840 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11850 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
11860 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
11870 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
11880 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
11890 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
118a0 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
118b0 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
118c0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
118d0 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
118e0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
118f0 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
11900 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
11910 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
11920 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
11930 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
11940 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
11950 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
11960 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
11970 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
11980 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
11990 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
119a0 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
119b0 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
119c0 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
119d0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
119e0 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
119f0 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
11a00 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
11a10 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
11a20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
11a30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
11a40 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
11a50 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
11a60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
11a70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
11a80 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
11a90 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
11aa0 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
11ab0 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
11ac0 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
11ad0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
11ae0 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
11af0 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
11b00 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
11b10 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
11b20 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
11b30 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
11b40 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
11b50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11b60 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
11b70 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
11b80 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
11b90 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
11ba0 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
11bb0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
11bc0 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
11bd0 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
11be0 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
11bf0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
11c00 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
11c10 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
11c20 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
11c30 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
11c40 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
11c50 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
11c60 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
11c70 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
11c80 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
11c90 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
11ca0 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
11cb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
11cc0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
11cd0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
11ce0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
11cf0 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
11d00 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
11d10 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
11d20 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
11d30 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
11d40 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
11d50 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
11d60 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
11d70 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
11d80 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
11d90 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
11da0 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
11db0 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
11dc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
11dd0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
11de0 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
11df0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
11e00 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
11e10 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
11e20 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
11e30 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
11e40 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
11e50 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
11e60 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
11e70 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
11e80 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
11e90 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
11ea0 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
11eb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
11ec0 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
11ed0 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
11ee0 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11ef0 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
11f00 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
11f10 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
11f20 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
11f30 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
11f40 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
11f50 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
11f60 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
11f70 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
11f80 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
11f90 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
11fa0 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
11fb0 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
11fc0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
11fd0 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
11fe0 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
11ff0 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
12000 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
12010 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
12020 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
12030 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
12040 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
12050 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
12060 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
12070 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
12080 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
12090 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
120a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
120b0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
120c0 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
120d0 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
120e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
120f0 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
12100 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
12110 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
12120 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12130 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
12140 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
12150 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
12160 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
12170 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
12180 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
12190 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
121a0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
121b0 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
121c0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
121d0 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
121e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
121f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
12200 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
12210 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12220 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  hasMaster){.  in
12230 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12240 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  ;      /* Error 
12250 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  code from journa
12260 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
12270 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
12280 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
12290 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  K;     /* Error 
122a0 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c  code from db fil
122b0 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  e unlock operati
122c0 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e  on */..  /* Do n
122d0 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61  othing if the pa
122e0 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
122f0 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
12300 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
12310 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52   or at least a R
12320 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68  ESERVED lock. Th
12330 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
12340 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
12350 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
12360 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12370 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52  n active but a R
12380 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
12390 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20  er lock is.  ** 
123a0 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63  held under two c
123b0 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20  ircumstances:.  
123c0 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74  **.  **   1. Aft
123d0 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  er a successful 
123e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
123f0 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c  back, it is call
12400 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20  ed with.  **    
12410 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f    eState==PAGER_
12420 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d  NONE and eLock==
12430 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
12440 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49    **.  **   2. I
12450 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  f a connection w
12460 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ith locking_mode
12470 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69  =exclusive holdi
12480 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
12490 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20  .  **      lock 
124a0 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f  switches back to
124b0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
124c0 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78  rmal and then ex
124d0 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20  ecutes a.  **   
124e0 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74     read-transact
124f0 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ion, this functi
12500 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  on is called wit
12510 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  h eState==PAGER_
12520 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20  READER .  **    
12530 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43    and eLock==EXC
12540 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e  LUSIVE_LOCK when
12550 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
12560 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
12570 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12580 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
12590 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
125a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
125b0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
125c0 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ROR );.  if( pPa
125d0 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
125e0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
125f0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
12600 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  <RESERVED_LOCK )
12610 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12620 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
12630 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
12640 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61  nts(pPager);.  a
12650 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
12660 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
12670 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
12680 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
12690 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
126a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
126b0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
126c0 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
126d0 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
126e0 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
126f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d    if( sqlite3IsM
12700 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
12710 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
12720 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12730 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
12740 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
12750 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73  EMORY );.      s
12760 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
12770 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
12780 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
12790 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
127a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
127b0 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
127c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
127d0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
127e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
127f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
12800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
12810 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
12820 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
12830 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
12840 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
12850 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
12860 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
12870 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
12880 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12890 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c  PERSIST.      ||
128a0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
128b0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
128c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
128d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
128e0 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20  E_WAL).    ){.  
128f0 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
12900 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
12910 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  hasMaster);.    
12920 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12930 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
12940 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
12950 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
12960 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
12970 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
12980 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
12990 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
129a0 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
129b0 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
129c0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
129d0 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
129e0 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
129f0 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
12a00 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
12a10 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
12a20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
12a30 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
12a40 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
12a50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12a60 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
12a70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12a80 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
12a90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12aa0 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
12ab0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
12ac0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
12ad0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
12ae0 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
12af0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
12b00 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
12b10 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
12b20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
12b30 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
12b40 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
12b50 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
12b60 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
12b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12b80 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
12b90 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
12ba0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
12bb0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
12bc0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
12bd0 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50  GES.    sqlite3P
12be0 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
12bf0 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
12c00 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
12c10 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ehash);.#endif. 
12c20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
12c30 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
12c40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
12c50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
12c60 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
12c70 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
12c80 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
12c90 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
12ca0 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
12cb0 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
12cc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
12cd0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
12ce0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
12cf0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
12d00 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
12d10 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
12d20 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
12d30 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
12d40 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
12d50 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
12d60 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
12d70 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
12d80 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
12d90 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
12da0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
12db0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
12dc0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
12dd0 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
12de0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
12df0 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
12e00 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
12e10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
12e20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
12e30 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
12e40 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
12e50 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
12e60 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
12e70 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
12e80 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
12e90 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12ea0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
12eb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12ec0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
12ed0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
12ee0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
12ef0 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
12f00 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12f10 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
12f20 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
12f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
12f40 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
12f50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
12f60 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
12f70 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
12f80 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
12f90 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
12fa0 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
12fb0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
12fc0 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
12fd0 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
12fe0 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
12ff0 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
13000 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
13010 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
13020 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
13030 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
13040 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
13050 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
13060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13070 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
13080 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
13090 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
130a0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
130b0 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
130c0 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
130d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
130e0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
130f0 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
13100 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
13110 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
13120 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
13130 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
13140 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
13150 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
13160 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
13170 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
13180 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
13190 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
131a0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
131b0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
131c0 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
131d0 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
131e0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
131f0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
13200 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
13210 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
13220 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
13230 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
13240 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
13250 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
13260 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
13270 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
13280 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
13290 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
132a0 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
132b0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
132c0 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
132d0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
132e0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
132f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
13300 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
13310 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
13320 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
13330 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
13340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
13350 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
13360 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
13370 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
13380 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
13390 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
133a0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
133b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
133c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
133d0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
133e0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
133f0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
13400 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
13410 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
13420 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
13430 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
13440 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
13450 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
13460 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
13470 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
13480 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
13490 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
134a0 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
134b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
134c0 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
134d0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
134e0 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
134f0 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
13500 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
13510 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
13520 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
13530 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
13540 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
13550 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
13560 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
13570 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
13580 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
13590 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
135a0 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
135b0 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
135c0 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
135d0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
135e0 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
135f0 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
13600 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
13610 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
13620 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
13630 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
13640 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
13650 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
13660 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
13670 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
13680 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
13690 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
136a0 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
136b0 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
136c0 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
136d0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
136e0 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
136f0 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
13700 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
13710 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
13720 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
13730 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
13740 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
13750 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
13760 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
13770 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
13780 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
13790 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
137a0 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
137b0 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
137c0 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
137d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
137e0 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
137f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
13800 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
13810 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
13820 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
13830 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
13840 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
13850 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
13860 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
13870 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
13880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
13890 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
138a0 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
138b0 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
138c0 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
138d0 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
138e0 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
138f0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
13900 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
13910 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
13920 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
13930 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
13940 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
13950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
13960 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
13970 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13980 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
13990 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
139a0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
139b0 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
139c0 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
139d0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
13a00 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
13a10 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
13a20 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
13a30 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
13a40 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
13a50 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
13a60 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
13a70 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
13a80 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
13a90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13aa0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
13ab0 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
13ac0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
13ad0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
13ae0 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
13af0 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
13b00 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
13b10 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
13b20 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
13b30 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
13b40 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
13b50 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
13b60 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
13b70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
13b80 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
13b90 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
13ba0 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
13bb0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
13bc0 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
13bd0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
13be0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
13bf0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
13c00 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
13c10 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
13c20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
13c30 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
13c40 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
13c50 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
13c60 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
13c70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
13c80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
13c90 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
13ca0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
13cb0 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
13cc0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
13cd0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
13ce0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
13cf0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
13d00 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
13d10 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
13d20 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
13d30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
13d40 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
13d50 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
13d60 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
13d70 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
13d80 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
13d90 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
13da0 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
13db0 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
13dc0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
13dd0 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
13de0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
13df0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
13e00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
13e10 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
13e20 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
13e30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
13e40 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
13e50 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
13e60 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
13e70 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
13e80 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
13e90 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
13ea0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
13eb0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
13ec0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
13ed0 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
13ee0 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
13ef0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
13f00 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
13f10 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
13f20 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
13f30 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
13f40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
13f50 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
13f60 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
13f70 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
13f80 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
13f90 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
13fa0 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
13fb0 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
13fc0 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
13fd0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
13fe0 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
13ff0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14000 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
14010 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
14020 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
14030 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
14040 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
14050 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
14060 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
14070 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
14080 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
14090 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
140a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
140b0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
140c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
140d0 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
140e0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
140f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
14100 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
14110 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
14120 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
14130 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
14140 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
14150 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
14160 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
14170 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
14180 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
141b0 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
141c0 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
141d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
141e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
141f0 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
14200 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
14210 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
14220 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
14230 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
14240 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
14250 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14270 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
14280 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
14290 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
142a0 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
142b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
142c0 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
142d0 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
142e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
142f0 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
14300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
14310 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
14320 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
14330 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14350 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
14360 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
14370 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
14380 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
14390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
143a0 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
143b0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
143c0 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
143f0 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
14400 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
14410 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
14420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
14430 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
14440 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
14450 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
14460 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
14470 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14480 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
14490 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
144a0 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
144b0 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
144c0 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
144d0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
144e0 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
144f0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
14500 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
14510 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
14520 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
14530 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
14540 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
14550 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
14560 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
14570 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
14580 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
14590 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
145a0 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
145b0 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
145c0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
145d0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
145e0 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
145f0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
14600 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
14610 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
14620 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
14630 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
14640 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
14650 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
14660 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
14670 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
14680 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
14690 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
146a0 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
146b0 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
146c0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
146d0 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
146e0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
146f0 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
14700 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
14710 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
14720 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
14730 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
14740 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
14750 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
14760 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
14770 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
14780 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
14790 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
147a0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
147b0 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
147c0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
147d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
147e0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
147f0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
14800 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
14810 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
14820 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
14830 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14840 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
14850 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14860 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
14870 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
14880 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
14890 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
148a0 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
148b0 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
148c0 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
148d0 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
148e0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
148f0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
14900 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
14910 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
14920 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
14930 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
14940 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
14950 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
14960 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
14970 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
14980 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
14990 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
149a0 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
149b0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
149c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
149d0 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
149e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
149f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
14a00 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
14a10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
14a20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
14a30 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
14a40 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
14a50 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
14a60 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
14a70 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
14a80 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
14a90 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
14aa0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
14ab0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
14ac0 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
14ad0 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
14ae0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
14af0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
14b00 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
14b10 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
14b20 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
14b30 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
14b40 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
14b50 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
14b60 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
14b70 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
14b80 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
14b90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
14ba0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
14bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
14bc0 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
14bd0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
14be0 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
14bf0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
14c00 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
14c10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14c20 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
14c30 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
14c40 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
14c50 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
14c60 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
14c70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14c80 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
14c90 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
14ca0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
14cb0 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
14cc0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14cd0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
14ce0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
14cf0 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
14d00 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
14d10 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
14d20 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
14d30 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
14d40 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
14d50 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
14d60 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
14d70 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
14d80 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
14d90 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
14da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14db0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14dc0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
14dd0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
14de0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
14df0 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
14e00 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
14e10 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
14e20 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
14e30 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
14e40 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
14e50 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
14e60 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
14e70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
14e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14e90 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
14ea0 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
14eb0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
14ec0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
14ed0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
14ee0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
14ef0 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
14f00 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
14f10 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
14f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f30 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
14f40 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
14f50 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
14f60 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
14f70 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
14f80 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
14f90 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
14fa0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
14fb0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
14fc0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
14fd0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
14fe0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
14ff0 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
15000 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
15010 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
15020 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
15030 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
15040 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
15050 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
15060 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
15070 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
15080 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
15090 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
150a0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
150b0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
150c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
150d0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
150e0 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
150f0 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
15100 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
15110 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
15120 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
15130 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
15140 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
15150 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
15160 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
15170 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
15180 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
15190 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
151a0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
151b0 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
151c0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
151d0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
151e0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
151f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
15200 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
15210 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
15220 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
15230 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
15240 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
15250 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
15260 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
15270 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
15280 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
15290 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
152a0 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
152b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
152c0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
152d0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
152e0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
152f0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
15300 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
15310 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
15320 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
15330 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
15340 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
15350 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
15360 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
15370 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
15380 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
15390 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
153a0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
153b0 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
153c0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
153d0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
153e0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
153f0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
15400 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
15410 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
15420 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
15430 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
15440 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
15450 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
15460 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
15470 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
15480 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
15490 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
154a0 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
154b0 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
154c0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
154d0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
154e0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
154f0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
15500 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
15510 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
15520 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
15530 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
15540 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
15550 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
15560 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
15570 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
15580 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
15590 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
155a0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
155b0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
155c0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
155d0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
155e0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
155f0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
15600 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
15610 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
15620 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
15630 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
15640 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
15650 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54 52  MDB );.  PAGERTR
15660 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
15670 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
15680 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
15690 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
156a0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
156b0 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
156c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
156d0 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
156e0 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
156f0 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
15700 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
15710 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
15720 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
15730 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
15740 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
15750 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
15760 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
15770 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
15780 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
15790 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
157a0 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
157b0 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  C));.  }.  if( (
157c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
157d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
157e0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
157f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
15800 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28 70  ).   && isOpen(p
15810 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
15820 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
15830 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
15840 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
15850 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
15860 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
15870 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
15880 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
15890 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
158a0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
158b0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
158c0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
158d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
158e0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
158f0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
15900 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
15910 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
15920 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
15930 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
15940 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
15950 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
15960 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
15970 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
15980 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
15990 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
159a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
159b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
159c0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
159d0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
159e0 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
159f0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
15a00 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
15a10 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
15a20 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
15a30 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
15a40 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
15a50 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
15a60 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
15a70 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
15a80 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
15a90 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
15aa0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
15ab0 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
15ac0 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
15ad0 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
15ae0 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
15af0 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
15b00 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
15b10 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
15b20 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
15b30 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
15b40 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
15b50 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
15b60 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
15b70 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
15b80 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
15b90 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
15ba0 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
15bb0 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
15bc0 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
15bd0 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
15be0 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
15bf0 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
15c00 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
15c10 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
15c20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
15c30 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
15c40 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
15c50 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
15c60 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
15c70 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
15c80 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
15c90 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
15ca0 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
15cb0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
15cc0 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
15cd0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
15ce0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
15cf0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
15d00 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
15d10 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
15d20 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
15d30 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
15d40 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
15d50 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
15d60 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
15d70 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
15d80 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
15d90 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
15da0 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
15db0 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
15dc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
15dd0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
15de0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
15df0 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
15e00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
15e10 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
15e20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
15e30 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
15e40 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
15e50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15e60 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
15e70 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
15e80 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
15e90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15ea0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15eb0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
15ec0 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
15ed0 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
15ee0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
15ef0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
15f00 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
15f10 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
15f20 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
15f30 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
15f40 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
15f50 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
15f60 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
15f70 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
15f80 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
15f90 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
15fa0 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
15fb0 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
15fc0 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
15fd0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
15fe0 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
15ff0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
16000 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
16010 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
16020 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
16030 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
16040 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
16050 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
16060 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
16070 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
16080 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
16090 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
160a0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
160b0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
160c0 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
160d0 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
160e0 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
160f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
16100 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
16110 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
16120 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
16130 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
16140 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
16150 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
16160 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
16170 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
16180 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
16190 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
161a0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
161b0 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
161c0 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
161d0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
161e0 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
161f0 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
16200 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
16210 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
16220 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
16230 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
16240 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
16250 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
16260 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
16270 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
16280 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
16290 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
162a0 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
162b0 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
162c0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
162d0 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
162e0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
162f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
16300 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
16310 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
16320 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
16330 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
16340 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
16350 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
16360 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
16370 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
16380 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
16390 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
163a0 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
163b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
163c0 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
163d0 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
163e0 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
163f0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
16400 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
16410 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
16420 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
16430 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
16440 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
16450 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
16460 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
16470 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
16480 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
16490 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
164a0 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
164b0 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
164c0 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
164d0 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
164e0 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
164f0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
16500 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
16510 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
16520 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
16530 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
16540 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
16550 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
16560 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
16570 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
16580 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16590 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
165a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
165b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
165c0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
165d0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
165e0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
165f0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
16600 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
16610 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
16620 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
16630 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
16640 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
16650 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
16660 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
16670 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
16680 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
16690 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
166a0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
166b0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
166c0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
166d0 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
166e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
166f0 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
16700 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
16710 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
16720 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
16730 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
16740 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
16750 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
16760 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
16770 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
16780 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16790 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
167a0 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
167b0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
167c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
167d0 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
167e0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
167f0 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
16800 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
16810 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
16820 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
16830 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
16840 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
16850 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
16860 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
16870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
16880 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
16890 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
168a0 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
168b0 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
168c0 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
168d0 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
168e0 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
168f0 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
16900 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
16910 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
16920 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
16930 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
16940 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
16950 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
16960 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
16970 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
16980 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
16990 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
169a0 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
169b0 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
169c0 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
169d0 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
169e0 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
169f0 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
16a00 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
16a10 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
16a20 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
16a30 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
16a40 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
16a50 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
16a60 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
16a70 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
16a80 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
16a90 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
16aa0 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
16ab0 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
16ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
16ad0 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
16ae0 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
16af0 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
16b00 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
16b10 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
16b20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16b30 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
16b40 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
16b50 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
16b60 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
16b70 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
16b80 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
16b90 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
16ba0 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
16bb0 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
16bc0 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
16bd0 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
16be0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
16bf0 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
16c00 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
16c10 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
16c20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
16c30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
16c40 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
16c50 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
16c60 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
16c70 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
16c80 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
16c90 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
16ca0 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
16cb0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
16cc0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
16cd0 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
16ce0 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
16cf0 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
16d00 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
16d10 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
16d20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
16d30 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
16d40 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
16d50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
16d60 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
16d70 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
16d80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16d90 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
16da0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
16db0 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
16dc0 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
16dd0 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
16de0 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
16df0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
16e00 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
16e10 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
16e20 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
16e30 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
16e40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16e50 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
16e60 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
16e70 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
16e80 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
16e90 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
16ea0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
16eb0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
16ec0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
16ed0 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
16ee0 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
16ef0 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
16f00 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
16f10 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
16f20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16f30 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
16f40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
16f60 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
16f70 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
16f80 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
16f90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
16fa0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16fb0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
16fc0 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
16fd0 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
16fe0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
16ff0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
17000 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
17010 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
17020 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
17030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
17040 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
17050 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
17060 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
17070 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
17080 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
17090 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
170a0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
170b0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
170c0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
170d0 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
170e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
170f0 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
17100 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
17110 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
17120 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
17130 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
17140 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
17150 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
17160 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
17170 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
17180 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
17190 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
171a0 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
171b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
171c0 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
171d0 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
171e0 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
171f0 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
17200 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
17210 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
17220 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
17230 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
17240 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
17250 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
17260 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
17270 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
17280 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
17290 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
172a0 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
172b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
172c0 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
172d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
172e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
172f0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
17300 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
17310 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
17320 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
17330 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
17340 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17350 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
17360 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
17370 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
17380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
17390 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
173a0 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
173b0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
173c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
173d0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
173e0 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
173f0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
17400 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
17410 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
17420 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
17430 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
17440 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
17450 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
17460 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
17470 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
17480 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
17490 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
174a0 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
174b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
174c0 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
174d0 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
174e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
174f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
17500 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
17510 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
17520 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
17530 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
17540 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
17550 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
17560 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
17570 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
17580 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
17590 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
175a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
175b0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
175c0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
175d0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
175e0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
175f0 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
17600 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
17610 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
17620 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
17630 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
17640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17650 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
17660 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
17670 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
17680 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
17690 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
176a0 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
176b0 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
176c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
176d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
176e0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
176f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17700 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
17710 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
17720 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
17730 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
17740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17750 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
17760 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
17770 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
17780 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
17790 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
177a0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
177b0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
177c0 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
177d0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
177e0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
177f0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
17800 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
17810 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
17820 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
17830 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
17840 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
17850 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
17860 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
17870 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
17880 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
17890 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
178a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
178b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
178c0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
178d0 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
178e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
178f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17900 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
17910 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
17920 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
17930 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
17940 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
17950 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
17960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
17970 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
17980 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
179a0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
179b0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
179c0 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
179d0 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
179e0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
179f0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
17a00 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
17a10 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
17a20 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
17a30 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
17a40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
17a50 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
17a60 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
17a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17a80 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
17a90 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17aa0 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
17ab0 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
17ac0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
17ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
17ae0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
17af0 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
17b00 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
17b10 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
17b20 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
17b30 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
17b40 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
17b50 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
17b60 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
17b70 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
17b80 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
17b90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17ba0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
17bb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
17bc0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
17bd0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
17be0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
17bf0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
17c00 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
17c10 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
17c20 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
17c30 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
17c40 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
17c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
17c60 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
17c70 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
17c80 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
17c90 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
17ca0 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
17cb0 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
17cc0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
17cd0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
17ce0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
17cf0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
17d00 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
17d10 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
17d20 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
17d30 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
17d40 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
17d50 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
17d60 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
17d70 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
17d80 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
17d90 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
17da0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
17db0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
17dc0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
17dd0 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
17de0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
17df0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
17e00 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
17e10 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
17e20 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
17e30 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
17e40 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
17e50 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
17e60 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
17e70 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
17e80 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
17e90 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
17ea0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
17eb0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
17ec0 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
17ed0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
17ee0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
17ef0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
17f00 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
17f10 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
17f20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
17f30 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
17f40 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
17f50 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
17f60 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
17f70 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
17f80 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
17f90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
17fa0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
17fb0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
17fc0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
17fd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
17fe0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
17ff0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
18000 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
18010 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
18020 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
18030 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
18040 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
18050 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
18060 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
18070 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
18080 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
18090 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
180a0 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
180b0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
180c0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
180d0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
180e0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
180f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
18100 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
18110 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
18120 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
18130 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
18140 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
18150 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
18160 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
18170 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
18180 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
18190 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
181a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
181b0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
181c0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
181d0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
181e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
181f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
18200 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
18210 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
18220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18240 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
18250 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
18260 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
18270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18290 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
182a0 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
182b0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
182c0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
182d0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
182e0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
182f0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
18300 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
18310 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
18320 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
18330 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
18340 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
18350 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
18360 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
18370 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
18380 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
18390 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
183a0 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
183b0 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
183c0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
183d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
183e0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
183f0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
18400 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
18410 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
18420 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
18430 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
18440 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
18450 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
18460 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
18470 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
18480 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
18490 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
184a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
184b0 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
184c0 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
184d0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
184e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
184f0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
18500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
18510 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
18520 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
18530 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
18540 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
18550 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
18560 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
18570 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
18580 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
18590 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
185a0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
185b0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
185c0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
185d0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
185e0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
185f0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
18600 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
18610 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
18620 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
18630 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
18640 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
18650 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
18660 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
18670 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
18680 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
18690 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
186a0 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
186b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
186c0 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
186d0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
186e0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
186f0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
18700 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
18710 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
18720 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
18730 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
18740 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
18750 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
18760 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
18770 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
18780 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
18790 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
187a0 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
187b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
187c0 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
187d0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
187e0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
187f0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
18800 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
18810 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
18820 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
18830 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
18840 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
18850 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
18860 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
18870 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
18880 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
18890 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
188a0 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
188b0 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
188c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
188d0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
188e0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
188f0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
18900 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
18910 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
18920 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
18930 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
18940 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
18950 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
18960 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
18970 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
18980 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
18990 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
189a0 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
189b0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
189c0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
189d0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
189e0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
189f0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
18a00 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
18a10 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
18a20 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
18a30 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
18a40 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
18a50 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
18a60 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
18a70 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
18a80 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
18a90 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
18aa0 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
18ab0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
18ac0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
18ad0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
18ae0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
18af0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
18b00 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
18b10 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
18b20 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
18b30 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
18b40 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
18b50 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
18b60 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
18b70 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
18b80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
18b90 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
18ba0 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
18bb0 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
18bc0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
18bd0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
18be0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
18bf0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
18c00 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
18c10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
18c20 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
18c30 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
18c40 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
18c50 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
18c60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
18c70 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
18c80 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
18c90 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
18ca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
18cb0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
18cc0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
18cd0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
18ce0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
18cf0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
18d00 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
18d10 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
18d20 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
18d30 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
18d40 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
18d50 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
18d60 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
18d70 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
18d80 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
18d90 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
18da0 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
18db0 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
18dc0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
18dd0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
18de0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
18df0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
18e00 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
18e10 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
18e20 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
18e30 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
18e40 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
18e50 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
18e60 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
18e70 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
18e80 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
18e90 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
18ea0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
18eb0 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
18ec0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
18ed0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
18ee0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
18ef0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
18f00 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
18f10 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
18f20 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
18f30 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
18f40 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
18f50 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
18f60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18f70 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
18f80 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
18f90 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
18fa0 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
18fb0 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
18fc0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
18fd0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
18fe0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
18ff0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
19000 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
19010 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
19020 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
19030 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
19040 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
19050 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
19060 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
19070 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
19080 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
19090 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
190a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
190b0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
190c0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
190d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
190e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
190f0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
19100 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
19110 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
19120 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
19130 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
19140 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
19150 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
19160 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
19170 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
19180 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
19190 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
191a0 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
191b0 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
191c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
191d0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
191e0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
191f0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
19200 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
19210 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
19220 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
19230 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
19240 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
19250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19260 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
19270 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
19280 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
19290 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
192a0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
192b0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
192c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
192d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
192e0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
192f0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
19300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19310 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
19320 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
19330 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19350 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
19360 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
19370 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
19380 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
19390 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
193a0 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
193b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
193c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
193d0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
193e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
193f0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
19400 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
19410 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
19420 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
19430 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
19440 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
19450 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
19460 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
19470 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
19480 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
19490 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
194a0 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
194b0 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
194c0 20 2a 2f 0a 0a 20 20 69 66 28 20 21 69 73 4f 70   */..  if( !isOp
194d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
194e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
194f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
19500 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
19510 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
19520 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
19530 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
19540 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
19550 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
19560 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
19570 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
19580 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
19590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
195a0 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
195b0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
195c0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
195d0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
195e0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
195f0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
19600 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
19610 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
19620 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19630 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
19640 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
19650 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
19660 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
19670 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
19680 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
19690 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
196a0 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
196b0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
196c0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
196d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
196e0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
196f0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
19700 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
19710 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
19720 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
19730 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
19740 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
19750 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
19760 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
19770 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
19780 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
19790 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
197a0 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
197b0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
197c0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
197d0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
197e0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
197f0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
19800 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
19810 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
19820 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
19830 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
19840 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
19850 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
19860 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19870 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
19880 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
19890 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
198a0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
198b0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
198c0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
198d0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
198e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
198f0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
19900 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
19910 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
19920 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
19930 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
19940 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
19950 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
19960 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
19970 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
19980 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
19990 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
199a0 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
199b0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
199c0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
199d0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
199e0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
199f0 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
19a00 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
19a10 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
19a20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
19a30 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
19a40 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
19a50 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
19a60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
19a70 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
19a80 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
19a90 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
19aa0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
19ab0 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
19ac0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
19ad0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
19ae0 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
19af0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
19b00 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
19b10 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
19b20 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
19b30 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
19b40 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
19b50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19b60 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
19b70 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
19b80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19b90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
19ba0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
19bb0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
19bc0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
19bd0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
19be0 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
19bf0 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
19c00 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
19c10 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
19c20 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
19c30 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
19c40 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
19c50 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
19c60 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
19c70 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
19c80 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
19c90 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
19ca0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
19cb0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
19cc0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
19cd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19ce0 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
19cf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19d00 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
19d10 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
19d20 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
19d30 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
19d40 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
19d50 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
19d60 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
19d70 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
19d80 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
19d90 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
19da0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
19db0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
19dc0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
19dd0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
19de0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
19df0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
19e00 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
19e10 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
19e20 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
19e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
19e40 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
19e50 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
19e60 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
19e70 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
19e80 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
19e90 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
19ea0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
19eb0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
19ec0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
19ed0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
19ee0 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
19ef0 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
19f00 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
19f10 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
19f20 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
19f30 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
19f40 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
19f50 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
19f60 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
19f70 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
19f80 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
19f90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
19fa0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
19fb0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
19fc0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
19fd0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
19fe0 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
19ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1a000 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1a010 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1a020 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1a030 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1a040 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1a050 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1a060 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1a070 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1a080 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1a090 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1a0a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1a0b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a0c0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1a0d0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1a0e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1a0f0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1a100 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1a110 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1a120 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1a130 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1a140 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1a150 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1a160 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1a170 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a180 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1a190 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1a1a0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1a1b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1a1c0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1a1d0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1a1e0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1a1f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1a200 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1a210 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1a220 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1a230 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1a240 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1a250 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a260 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1a270 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1a280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a290 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1a2a0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1a2b0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1a2c0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1a2d0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1a2e0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1a2f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1a300 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1a310 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1a320 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1a330 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1a340 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1a350 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1a360 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1a370 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1a380 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1a390 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1a3a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1a3b0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1a3c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a3d0 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1a3e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a3f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
1a400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1a410 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
1a420 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a430 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1a440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1a450 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1a460 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1a470 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1a480 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1a490 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1a4a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1a4b0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1a4c0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1a4d0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1a4e0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1a4f0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1a500 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1a510 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1a520 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1a530 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1a540 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1a550 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1a560 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1a570 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1a580 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1a590 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1a5a0 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1a5b0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1a5c0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1a5d0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1a5e0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1a5f0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1a600 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1a610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1a620 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1a630 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1a640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1a650 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1a660 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1a670 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1a680 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1a690 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1a6a0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1a6b0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1a6c0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1a6d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1a6e0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1a6f0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1a700 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1a710 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1a720 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1a730 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1a740 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1a750 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1a760 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1a770 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1a780 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1a790 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a7a0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1a7b0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1a7c0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1a7d0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1a7e0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1a7f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a800 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1a810 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1a820 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1a830 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1a840 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1a850 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1a860 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1a870 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1a880 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1a890 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1a8a0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1a8b0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1a8c0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1a8d0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1a8e0 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
1a8f0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1a900 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
1a910 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1a920 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
1a930 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1a940 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
1a950 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
1a960 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
1a970 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
1a980 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
1a990 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
1a9a0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
1a9b0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
1a9c0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
1a9d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1a9e0 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
1a9f0 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
1aa00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1aa10 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
1aa20 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1aa30 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
1aa40 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
1aa50 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
1aa60 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
1aa70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
1aa80 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
1aa90 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
1aaa0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
1aab0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
1aac0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
1aad0 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
1aae0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1aaf0 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
1ab00 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
1ab10 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
1ab20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
1ab30 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
1ab40 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1ab50 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
1ab60 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
1ab70 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
1ab80 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
1ab90 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1aba0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
1abb0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1abc0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1abd0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1abe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1abf0 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
1ac00 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ac10 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
1ac20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1ac30 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1ac40 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1ac50 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1ac60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1ac70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1ac80 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1ac90 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
1aca0 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 70 50  er->noSync && pP
1acb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1acc0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1acd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ace0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1acf0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
1ad00 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
1ad10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ad20 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
1ad30 6e 6f 53 79 6e 63 20 26 26 20 70 50 61 67 65 72  noSync && pPager
1ad40 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1ad50 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
1ad60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ad70 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
1ad80 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1ad90 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  flags);.  }.  if
1ada0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1adb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1adc0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1add0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1ade0 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20  r[0]!='\0');.   
1adf0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1ae00 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1ae10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ae20 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1ae30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1ae40 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1ae50 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1ae60 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1ae70 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1ae80 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1ae90 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1aea0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1aeb0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1aec0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1aed0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1aee0 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1aef0 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1af00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1af10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
1af20 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1af30 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
1af40 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
1af50 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
1af60 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
1af70 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
1af80 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
1af90 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
1afa0 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
1afb0 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
1afc0 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1afd0 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
1afe0 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
1aff0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1b000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1b010 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1b020 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
1b030 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1b040 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1b050 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
1b060 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
1b070 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
1b080 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
1b090 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1b0a0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
1b0b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1b0c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
1b0d0 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
1b0e0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
1b0f0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1b100 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
1b110 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
1b120 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1b130 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
1b140 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1b150 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
1b160 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1b170 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1b180 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
1b190 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1b1a0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1b1b0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
1b1c0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
1b1d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1b1e0 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1b1f0 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1b200 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1b210 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1b220 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1b230 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1b240 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1b250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b260 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1b270 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1b280 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20    int isInWal = 
1b290 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1b2a0 2a 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69  * True if page i
1b2b0 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  s in log file */
1b2c0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1b2d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1b2e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1b2f0 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1b300 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b310 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1b320 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1b330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1b340 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1b350 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1b360 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
1b370 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65  fd)) ){.    asse
1b380 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1b390 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  File );.    mems
1b3a0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
1b3b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b3c0 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ze);.    return 
1b3d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1b3e0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1b3f0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
1b400 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20   /* Try to pull 
1b410 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1b420 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
1b430 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1b440 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50  qlite3WalRead(pP
1b450 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
1b460 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a  , &isInWal, pgsz
1b470 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1b480 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1b490 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57  ITE_OK && !isInW
1b4a0 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f  al ){.    i64 iO
1b4b0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1b4c0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1b4d0 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1b4e0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1b4f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1b500 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66  pData, pgsz, iOf
1b510 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1b520 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1b530 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1b540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b550 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1b560 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1b570 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1b580 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
1b590 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
1b5a0 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
1b5b0 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
1b5c0 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
1b5d0 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
1b5e0 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
1b5f0 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
1b600 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
1b610 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
1b620 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
1b630 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
1b640 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
1b650 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
1b660 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
1b670 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1b680 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
1b690 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
1b6a0 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
1b6b0 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
1b6c0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
1b6d0 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
1b6e0 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
1b6f0 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
1b700 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
1b710 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
1b720 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
1b730 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1b740 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
1b750 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
1b760 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
1b770 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
1b780 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
1b790 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b7a0 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
1b7b0 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
1b7c0 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
1b7d0 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67  ** white noising
1b7e0 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1b7f0 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1b800 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1b810 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1b820 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1b830 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1b840 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1b850 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1b860 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1b870 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1b880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b890 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1b8a0 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1b8b0 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1b8c0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1b8d0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1b8e0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1b8f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1b900 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1b910 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1b920 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
1b930 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
1b940 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45  _NOMEM);..  PAGE
1b950 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1b960 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1b970 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1b980 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1b990 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1b9a0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1b9b0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41  er, pgno));.  PA
1b9c0 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
1b9d0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1b9e0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1b9f0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1ba00 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
1ba10 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1ba20 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  pPg)));..  retur
1ba30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1ba40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1ba50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ba60 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1ba70 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1ba80 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1ba90 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1baa0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1bab0 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1bac0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1bad0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1bae0 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1baf0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1bb00 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1bb10 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1bb20 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1bb30 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1bb40 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1bb50 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1bb60 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1bb70 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1bb80 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1bb90 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1bba0 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1bbb0 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1bbc0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1bbd0 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1bbe0 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1bbf0 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1bc00 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1bc10 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1bc20 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1bc30 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1bc40 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1bc50 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1bc60 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1bc70 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1bc80 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1bc90 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1bca0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1bcb0 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1bcc0 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1bcd0 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1bce0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bcf0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1bd00 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1bd10 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1bd20 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71  pPg;..  pPg = sq
1bd30 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1bd40 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1bd50 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1bd60 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1bd70 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1bd80 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1bd90 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1bda0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1bdb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1bdc0 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1bdd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bde0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1bdf0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1be00 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1be10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1be20 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1be30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1be40 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1be50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1be60 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1be70 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1be80 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1be90 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1bea0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1beb0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1bec0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1bed0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1bee0 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1bef0 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1bf00 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1bf10 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1bf20 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1bf30 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1bf40 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1bf50 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1bf60 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1bf70 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1bf80 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1bf90 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1bfa0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1bfb0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1bfc0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1bfd0 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1bfe0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1bff0 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1c000 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1c010 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1c020 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1c030 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1c040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c050 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c060 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1c070 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1c080 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1c090 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1c0a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1c0b0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1c0c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c0d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c0f0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1c100 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c120 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1c130 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1c140 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1c150 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1c160 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1c170 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1c180 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1c190 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1c1a0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1c1b0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1c1c0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1c1d0 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1c1e0 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1c1f0 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1c200 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1c210 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1c220 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1c230 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1c240 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1c250 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1c260 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1c270 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1c280 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1c290 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1c2a0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1c2b0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1c2c0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1c2d0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1c2e0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1c2f0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1c300 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1c310 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1c320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1c330 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1c340 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1c350 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1c360 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1c370 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1c380 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1c390 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1c3a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c3b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1c3c0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1c3d0 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1c3e0 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1c3f0 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1c400 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1c410 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1c420 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1c430 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1c440 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1c450 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1c460 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1c470 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1c480 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1c490 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2f 20  ** changed. .*/ 
1c4a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1c4b0 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1c4c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c4e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1c4f0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c510 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1c520 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1c530 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1c560 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1c570 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1c580 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20  ommit,          
1c590 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c5a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1c5b0 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 79  mmit */.  int sy
1c5c0 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20 20 20  nc_flags        
1c5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1c5e0 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 4f 73  gs to pass to Os
1c5f0 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20 2a 2f  Sync() (or 0) */
1c600 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c630 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
1c640 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  t( pPager->pWal 
1c650 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c660 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1c670 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1c680 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c690 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1c6a0 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79  te, isCommit, sy
1c6b0 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a 20 20  nc_flags.  );.  
1c6c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c6d0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1c6e0 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64  ckup ){.    PgHd
1c6f0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1c700 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1c710 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
1c720 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
1c730 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
1c740 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
1c750 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
1c760 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c770 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1c780 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1c790 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1c7a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c7b0 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1c7c0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1c7d0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1c7e0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1c7f0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1c800 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1c810 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1c820 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1c830 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1c840 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1c850 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1c860 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1c870 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1c880 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1c890 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1c8a0 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1c8b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1c8c0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1c8d0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1c8e0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c8f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c910 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1c920 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c940 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1c950 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1c960 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1c970 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1c980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1c990 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1c9a0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1c9b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1c9c0 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1c9d0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1c9e0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1c9f0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1ca00 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1ca10 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ca20 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1ca30 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1ca40 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1ca50 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1ca60 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1ca70 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1ca80 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1ca90 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1caa0 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1cab0 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1cac0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1cad0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1cae0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1caf0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1cb00 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1cb10 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1cb20 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1cb30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cb40 45 5f 4f 4b 20 26 26 20 63 68 61 6e 67 65 64 20  E_OK && changed 
1cb50 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1cb60 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
1cb70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cb80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cb90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1cba0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1cbb0 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1cbc0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1cbd0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1cbe0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1cbf0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1cc00 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1cc10 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1cc20 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1cc30 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1cc40 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1cc50 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1cc60 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1cc70 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1cc80 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1cc90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1cca0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1ccb0 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1ccc0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1ccd0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1cce0 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1ccf0 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1cd00 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1cd10 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1cd20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1cd30 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1cd40 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1cd50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1cd60 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1cd70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1cd80 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1cd90 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1cda0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1cdb0 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1cdc0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1cdd0 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1cde0 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1cdf0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1ce00 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1ce10 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1ce20 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1ce30 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1ce40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1ce50 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1ce60 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1ce70 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1ce80 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1ce90 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1cea0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1ceb0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1cec0 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1ced0 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1cee0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1cef0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1cf00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1cf10 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1cf20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cf30 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1cf40 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  CK || pPager->no
1cf50 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50  Readlock );.  nP
1cf60 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1cf70 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1cf80 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1cf90 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1cfa0 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62   was not availab
1cfb0 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1cfc0 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  sub-system,.  **
1cfd0 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61   determine it ba
1cfe0 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1cff0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d000 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a  file. If the siz
1d010 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  e.  ** of the da
1d020 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1d030 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
1d040 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1d050 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f  ge-size,.  ** ro
1d060 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  und down to the 
1d070 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78  nearest page. Ex
1d080 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c  cept, any file l
1d090 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a  arger than 0.  *
1d0a0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  * bytes in size 
1d0b0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1d0c0 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1d0d0 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f  t one page..  */
1d0e0 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1d0f0 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1d100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d110 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d120 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1d130 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d140 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1d150 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1d160 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1d170 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1d180 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  >fd) ){.      in
1d190 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1d1a0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1d1b0 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  >fd, &n);.      
1d1c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d1d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1d1e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d1f0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
1d200 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61  = (Pgno)(n / pPa
1d210 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1d220 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1d230 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20   && n>0 ){.     
1d240 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20   nPage = 1;.    
1d250 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1d260 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1d270 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1d280 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1d290 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
1d2a0 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1d2b0 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1d2c0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1d2d0 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1d2e0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1d2f0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1d300 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1d310 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1d320 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1d330 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1d340 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1d350 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1d360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d370 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  }.../*.** Check 
1d380 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1d390 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
1d3a0 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
1d3b0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
1d3c0 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
1d3d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d3e0 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
1d3f0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
1d400 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
1d410 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
1d420 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
1d430 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d440 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
1d450 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1d460 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
1d470 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
1d480 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
1d490 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
1d4a0 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
1d4b0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1d4c0 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
1d4d0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1d4e0 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
1d4f0 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
1d500 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
1d510 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
1d520 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
1d530 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
1d540 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1d550 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
1d560 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
1d570 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
1d580 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
1d590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d5a0 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
1d5b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
1d5c0 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
1d5d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
1d5e0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
1d5f0 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
1d600 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
1d610 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
1d620 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
1d630 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
1d640 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
1d650 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
1d660 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
1d670 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
1d680 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
1d690 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
1d6a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1d6b0 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
1d6c0 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
1d6d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d6e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d6f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d700 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1d710 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1d720 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1d730 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
1d740 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1d750 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  ck );..  if( !pP
1d760 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1d770 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
1d7a0 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
1d7b0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
1d7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d7d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1d7e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d7f0 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
1d800 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1d810 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1d820 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1d830 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
1d840 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1d850 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1d860 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
1d870 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
1d880 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c   0);.      isWal
1d890 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1d8a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1d8b0 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
1d8c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1d8d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
1d8e0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1d8f0 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a  _EXISTS, &isWal.
1d900 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1d910 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1d930 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
1d940 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
1d950 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
1d960 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
1d970 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  che)==0 );.     
1d980 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d990 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
1d9a0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  er, 0);.      }e
1d9b0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1d9c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
1d9d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1d9e0 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AL ){.        pP
1d9f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1da00 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
1da10 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20  LMODE_DELETE;.  
1da20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1da30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1da40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  endif../*.** Pla
1da50 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
1da60 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
1da70 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
1da80 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
1da90 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
1daa0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1dab0 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
1dac0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
1dad0 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
1dae0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
1daf0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
1db00 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
1db10 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
1db20 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
1db30 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
1db40 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
1db50 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
1db60 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
1db70 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
1db80 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
1db90 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
1dba0 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
1dbb0 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
1dbc0 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
1dbd0 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
1dbe0 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
1dbf0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1dc00 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
1dc10 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
1dc20 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
1dc30 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
1dc40 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
1dc50 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
1dc60 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
1dc70 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
1dc80 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
1dc90 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
1dca0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1dcb0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
1dcc0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1dcd0 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
1dce0 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
1dcf0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1dd00 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
1dd10 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
1dd20 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
1dd30 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
1dd40 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
1dd50 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
1dd60 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1dd70 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1dd80 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1dd90 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
1dda0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1ddb0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
1ddc0 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
1ddd0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
1dde0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1ddf0 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
1de00 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
1de10 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1de20 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
1de30 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
1de40 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
1de50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
1de60 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
1de70 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
1de80 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
1de90 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
1dea0 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
1deb0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
1dec0 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
1ded0 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
1dee0 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
1def0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1df00 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
1df10 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
1df20 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
1df30 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
1df40 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
1df50 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
1df60 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
1df70 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1df80 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
1df90 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
1dfa0 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
1dfb0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1dfc0 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
1dfd0 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
1dfe0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
1dff0 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
1e000 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
1e010 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
1e020 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
1e030 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
1e040 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
1e050 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
1e060 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
1e070 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
1e080 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
1e090 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
1e0a0 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
1e0b0 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
1e0c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1e0d0 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
1e0e0 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
1e0f0 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
1e100 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
1e110 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
1e120 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
1e130 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
1e140 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
1e150 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
1e160 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
1e170 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1e180 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
1e190 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
1e1a0 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
1e1b0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
1e1c0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
1e1d0 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
1e1e0 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
1e1f0 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
1e200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e210 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e220 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
1e230 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
1e240 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
1e250 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
1e260 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
1e270 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
1e280 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1e290 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
1e2a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e2b0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1e2c0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
1e2d0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1e2e0 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
1e2f0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
1e300 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
1e310 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
1e320 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
1e330 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
1e340 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
1e350 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
1e360 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
1e370 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e380 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e390 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
1e3a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
1e3b0 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
1e3c0 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
1e3d0 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
1e3e0 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
1e3f0 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
1e400 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
1e410 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
1e420 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
1e430 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
1e440 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1e450 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1e460 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1e470 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1e480 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
1e490 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
1e4a0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1e4b0 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
1e4c0 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
1e4d0 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
1e4e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1e4f0 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
1e500 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
1e510 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
1e520 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
1e530 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
1e540 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
1e550 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
1e560 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
1e570 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
1e580 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
1e590 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
1e5a0 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
1e5b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1e5c0 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
1e5d0 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
1e5e0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
1e5f0 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
1e600 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e610 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
1e620 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
1e630 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
1e640 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1e650 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
1e660 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
1e670 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1e680 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
1e690 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
1e6a0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1e6b0 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
1e6c0 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
1e6d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e6e0 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
1e6f0 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
1e700 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1e710 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
1e720 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
1e730 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
1e740 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
1e750 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
1e760 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
1e770 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
1e780 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
1e790 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1e7a0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
1e7b0 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
1e7c0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1e7d0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
1e7e0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
1e7f0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
1e800 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
1e810 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
1e820 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
1e830 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
1e840 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
1e850 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1e860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
1e870 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
1e880 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1e890 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
1e8a0 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
1e8b0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
1e8c0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
1e8d0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1e8e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1e8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
1e900 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1e910 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
1e920 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
1e930 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
1e940 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1e950 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
1e960 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
1e970 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
1e980 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
1e990 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
1e9a0 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
1e9b0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e9c0 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
1e9d0 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
1e9e0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
1e9f0 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
1ea00 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
1ea10 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
1ea20 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
1ea30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ea40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ea50 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
1ea60 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
1ea70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1ea80 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
1ea90 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
1eaa0 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
1eab0 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
1eac0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
1ead0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1eae0 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
1eaf0 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
1eb00 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
1eb10 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1eb20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
1eb30 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
1eb40 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1eb50 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1eb60 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1eb70 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
1eb80 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
1eb90 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
1eba0 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
1ebb0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
1ebc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
1ebd0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
1ebe0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1ebf0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1ec00 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
1ec10 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
1ec20 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1ec30 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1ec40 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1ec50 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
1ec60 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
1ec70 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1ec80 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
1ec90 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1eca0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1ecb0 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
1ecc0 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
1ecd0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1ece0 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
1ecf0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1ed00 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1ed10 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
1ed20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ed30 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
1ed40 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1ed50 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
1ed60 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
1ed70 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1ed80 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
1ed90 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
1eda0 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
1edb0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
1edc0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
1edd0 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
1ede0 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
1edf0 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
1ee00 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
1ee10 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
1ee20 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
1ee30 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
1ee40 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
1ee50 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
1ee60 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
1ee70 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
1ee80 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
1ee90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
1eea0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1eeb0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
1eec0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  = pSavepoint->iS
1eed0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1eee0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
1eef0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1ef00 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1ef10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1ef20 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
1ef30 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
1ef40 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74  vepoint->aWalDat
1ef50 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  a);.    }.    fo
1ef60 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
1ef70 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
1ef80 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
1ef90 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
1efa0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
1efb0 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28  rt( offset==ii*(
1efc0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
1efd0 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
1efe0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1eff0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1f000 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
1f010 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
1f020 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1f030 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1f040 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
1f050 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
1f060 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
1f080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1f090 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65  = szJ;.  }..  re
1f0a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f0b0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
1f0c0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
1f0d0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
1f0e0 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
1f0f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f100 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
1f110 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1f120 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
1f130 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
1f140 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
1f150 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
1f160 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
1f170 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
1f180 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
1f190 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
1f1a0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
1f1b0 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
1f1c0 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
1f1d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
1f1e0 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
1f1f0 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
1f200 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
1f210 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
1f220 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
1f230 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
1f240 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
1f250 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
1f260 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
1f270 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
1f280 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
1f290 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
1f2a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
1f2b0 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
1f2c0 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
1f2d0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
1f2e0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
1f2f0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
1f300 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
1f310 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
1f320 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
1f330 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1f340 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
1f350 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
1f360 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
1f370 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
1f380 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
1f390 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
1f3a0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
1f3b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
1f3d0 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
1f3e0 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
1f3f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f400 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f410 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
1f420 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
1f430 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
1f440 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
1f450 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
1f460 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
1f470 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
1f480 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
1f490 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
1f4a0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
1f4b0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
1f4c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
1f4d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1f4e0 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
1f4f0 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
1f500 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
1f510 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
1f520 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
1f530 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
1f550 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
1f560 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
1f570 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
1f580 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
1f590 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
1f5a0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
1f5b0 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
1f5c0 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
1f5d0 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
1f5e0 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
1f5f0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
1f600 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
1f610 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
1f620 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
1f630 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
1f640 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
1f650 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
1f660 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
1f670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f680 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
1f690 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1f6a0 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
1f6b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1f6c0 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46  nt level, int bF
1f6d0 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61  ullFsync){.  pPa
1f6e0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
1f6f0 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
1f700 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
1f710 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
1f720 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
1f730 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
1f740 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
1f750 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1f760 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e  ags = (bFullFsyn
1f770 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  c?SQLITE_SYNC_FU
1f780 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  LL:SQLITE_SYNC_N
1f790 4f 52 4d 41 4c 29 3b 0a 7d 0a 23 65 6e 64 69 66  ORMAL);.}.#endif
1f7a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1f7b0 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
1f7c0 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
1f7d0 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
1f7e0 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
1f7f0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
1f800 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
1f810 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
1f820 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
1f830 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
1f840 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
1f850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1f860 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1f870 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
1f880 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1f890 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
1f8a0 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
1f8b0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
1f8c0 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
1f8d0 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
1f8e0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1f8f0 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
1f900 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
1f910 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
1f920 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
1f930 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
1f940 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
1f950 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
1f960 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
1f970 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
1f980 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
1f990 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
1f9a0 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
1f9b0 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
1f9c0 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
1f9d0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
1f9e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
1f9f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1fa00 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
1fa10 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
1fa20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1fa30 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
1fa40 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1fa50 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
1fa60 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
1fa70 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
1fa80 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
1fa90 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
1faa0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
1fab0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
1fac0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1fad0 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
1fae0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1faf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1fb00 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
1fb10 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
1fb20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1fb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1fb40 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
1fb50 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1fb60 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
1fb70 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
1fb80 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
1fb90 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
1fba0 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
1fbb0 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
1fbc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1fbd0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
1fbe0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1fbf0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1fc00 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
1fc10 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1fc20 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
1fc30 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1fc40 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
1fc50 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
1fc60 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
1fc70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1fc80 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
1fc90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1fca0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
1fcb0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
1fcc0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1fcd0 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
1fce0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
1fcf0 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
1fd00 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
1fd10 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
1fd20 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
1fd30 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
1fd40 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
1fd50 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
1fd60 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
1fd70 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
1fd80 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
1fd90 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
1fda0 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
1fdb0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1fdc0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
1fdd0 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
1fde0 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
1fdf0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
1fe00 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
1fe10 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
1fe20 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
1fe30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1fe40 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
1fe50 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
1fe60 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
1fe70 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
1fe80 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
1fe90 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
1fea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1feb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1fed0 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
1fee0 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
1fef0 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
1ff00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
1ff10 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
1ff20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
1ff30 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
1ff40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
1ff50 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
1ff60 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
1ff70 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
1ff80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
1ff90 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
1ffa0 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
1ffb0 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
1ffc0 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
1ffd0 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
1ffe0 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
1fff0 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
20000 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
20010 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
20020 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
20030 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
20040 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
20050 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
20060 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
20090 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
200a0 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
200b0 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
200c0 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
200d0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
200e0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
200f0 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
20100 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
20110 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
20120 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
20130 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78  ){  .  pPager->x
20140 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
20150 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
20160 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
20170 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
20180 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  dlerArg;.}../*.*
20190 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
201a0 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
201b0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
201c0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
201d0 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
201e0 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
201f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
20200 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
20210 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
20220 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20230 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
20240 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
20250 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
20260 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
20270 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
20280 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
20290 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
202a0 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
202b0 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
202c0 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
202d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
202e0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
202f0 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
20300 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
20310 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
20320 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
20330 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
20340 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
20350 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
20360 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
20370 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
20380 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
20390 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
203a0 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
203b0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
203c0 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
203d0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
203e0 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
203f0 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
20400 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
20410 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
20420 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
20430 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
20440 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
20450 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
20460 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
20470 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
20480 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
20490 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
204a0 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
204b0 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
204c0 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
204d0 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
204e0 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
204f0 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
20500 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
20510 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
20520 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
20530 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
20540 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
20550 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
20560 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
20570 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
20580 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
20590 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
205a0 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
205b0 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
205c0 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
205d0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
205e0 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
205f0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
20600 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
20610 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
20620 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
20630 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
20640 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
20650 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
20660 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
20670 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
20680 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
20690 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
206a0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
206b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
206c0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
206d0 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
206e0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
206f0 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
20700 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20710 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ;..  /* It is no
20720 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  t possible to do
20730 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70   a full assert_p
20740 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72  ager_state() her
20750 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20  e, as this.  ** 
20760 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
20770 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
20780 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20  in PagerOpen(), 
20790 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65  before the state
207a0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67  .  ** of the Pag
207b0 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74  er object is int
207c0 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
207d0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nt..  */.  asser
207e0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
207f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
20800 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
20810 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
20820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
20830 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
20840 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  PageSize;.    as
20850 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
20860 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
20870 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
20880 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
20890 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66  _SIZE) );.    if
208a0 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
208b0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
208c0 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26  bSize==0).     &
208d0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
208e0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
208f0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
20900 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
20910 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
20920 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
20930 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
20940 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
20950 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
20960 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  p space */.     
20970 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
20980 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
20990 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
209a0 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50  PEN && isOpen(pP
209b0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
209c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
209d0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
209e0 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
209f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
20a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
20a10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
20a20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
20a30 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
20a40 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
20a50 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
20a60 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
20a70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
20a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20a90 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
20aa0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
20ab0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20ac0 20 3d 20 6e 42 79 74 65 2f 70 61 67 65 53 69 7a   = nByte/pageSiz
20ad0 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
20ae0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
20af0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
20b00 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
20b10 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
20b20 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e);.        pPag
20b30 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
20b40 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71  pNew;.        sq
20b50 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
20b60 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
20b70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
20b80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20b90 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20  .    *pPageSize 
20ba0 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70  = (u16)pPager->p
20bb0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  ageSize;.    if(
20bc0 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
20bd0 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
20be0 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
20bf0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
20c00 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
20c10 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
20c20 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
20c30 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
20c40 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
20c50 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
20c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c70 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
20c80 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
20c90 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
20ca0 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
20cb0 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
20cc0 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
20cd0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
20ce0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
20cf0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
20d00 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
20d10 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
20d20 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
20d30 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
20d40 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
20d50 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
20d60 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
20d70 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
20d80 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
20d90 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
20da0 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
20db0 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
20dc0 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
20dd0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
20de0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
20df0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
20e00 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
20e10 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
20e20 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
20e30 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
20e40 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
20e50 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
20e60 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
20e70 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
20e80 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
20e90 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
20ea0 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
20eb0 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
20ec0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
20ed0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
20ee0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
20ef0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
20f00 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
20f10 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
20f20 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
20f30 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
20f40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20f50 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
20f60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
20f70 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
20f80 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
20f90 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
20fa0 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
20fb0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
20fc0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te!=PAGER_OPEN &
20fd0 26 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  & pPager->mxPgno
20fe0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
20ff0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
21000 78 50 67 6e 6f 20 3d 20 70 50 61 67 65 72 2d 3e  xPgno = pPager->
21010 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65  dbSize;.  }.  re
21020 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
21030 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
21040 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
21050 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
21060 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
21070 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
21080 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
21090 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
210a0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
210b0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
210c0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
210d0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
210e0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
210f0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
21100 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
21110 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
21120 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
21130 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
21140 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
21150 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
21160 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
21170 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
21180 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
21190 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
211a0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
211b0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
211c0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
211d0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
211e0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
211f0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
21200 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
21210 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
21220 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
21230 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
21240 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
21250 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
21260 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
21270 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
21280 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
21290 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
212a0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
212b0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
212c0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
212d0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
212e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
212f0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
21300 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
21310 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
21320 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
21330 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
21340 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
21350 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
21360 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
21370 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
21380 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
21390 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
213a0 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
213b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
213c0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
213d0 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
213e0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
213f0 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
21400 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
21410 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
21420 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
21430 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
21440 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
21450 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
21460 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
21470 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
21480 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
21490 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
214a0 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
214b0 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
214c0 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
214d0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
214e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
214f0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
21500 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
21510 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
21520 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
21530 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
21540 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
21550 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21560 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
21570 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21580 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
21590 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
215a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
215b0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
215c0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
215d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
215e0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
215f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
21600 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
21610 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
21620 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
21630 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
21640 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
21650 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
21660 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
21670 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
21680 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
21690 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
216a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
216b0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
216c0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
216d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
216e0 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
216f0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
21700 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
21710 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
21720 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21730 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
21740 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
21750 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
21760 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
21770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21780 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21790 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
217a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
217b0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
217c0 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
217d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
217e0 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
217f0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
21800 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
21810 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
21820 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
21830 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
21840 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
21850 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
21860 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
21870 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
21880 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
21890 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  age file..*/.int
218a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
218b0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
218c0 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
218d0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
218e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
218f0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
21900 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21910 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
21920 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b  ITER_FINISHED );
21930 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e  .  *pnPage = (in
21940 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  t)pPager->dbSize
21950 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21960 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
21970 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
21980 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
21990 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
219a0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
219b0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
219c0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
219d0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
219e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
219f0 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
21a00 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
21a10 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
21a20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
21a30 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
21a40 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
21a50 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
21a60 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
21a70 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
21a80 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
21a90 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
21aa0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
21ab0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
21ac0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
21ad0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
21ae0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
21af0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
21b00 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
21b10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21b20 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
21b30 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
21b40 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
21b50 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
21b60 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
21b70 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
21b80 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
21b90 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
21ba0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
21bb0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
21bc0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
21bd0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
21be0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
21bf0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
21c00 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21c30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
21c40 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
21c50 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
21c60 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
21c70 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
21c80 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
21c90 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
21ca0 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
21cb0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
21cc0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
21cd0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
21ce0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
21cf0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
21d00 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
21d10 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
21d20 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
21d30 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
21d40 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
21d50 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
21d60 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
21d70 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
21d80 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
21d90 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
21da0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
21db0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
21dc0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
21dd0 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
21de0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
21df0 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
21e00 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
21e10 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
21e20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
21e30 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
21e40 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
21e50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
21e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
21e70 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
21e80 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
21e90 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
21ea0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
21eb0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
21ec0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
21ed0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
21ee0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
21ef0 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
21f00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
21f10 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
21f20 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
21f30 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
21f40 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
21f50 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
21f60 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
21f70 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
21f80 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
21f90 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
21fa0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
21fb0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
21fc0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
21fd0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
21fe0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21ff0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
22000 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
22010 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
22020 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
22030 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
22040 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
22050 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
22060 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
22070 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
22080 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
22090 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
220a0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
220b0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
220c0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
220d0 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
220e0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
220f0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
22100 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
22110 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
22120 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
22130 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
22140 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
22150 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
22160 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75  correct behaviou
22170 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
22180 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
22190 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
221a0 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
221b0 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
221c0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
221d0 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
221e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
221f0 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
22200 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
22210 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
22220 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
22230 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
22240 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
22250 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
22260 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
22270 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
22280 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
22290 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
222a0 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
222b0 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
222c0 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
222d0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
222e0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
222f0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
22300 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
22310 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
22320 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
22330 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
22340 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
22350 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
22360 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
22370 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
22380 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
22390 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
223a0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
223b0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
223c0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
223d0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
223e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
223f0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
22400 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
22410 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
22420 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
22430 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
22440 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
22450 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
22460 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
22470 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
22480 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
22490 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
224a0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
224b0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
224c0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
224d0 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
224e0 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
224f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
22500 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
22510 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
22520 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
22530 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
22540 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
22550 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
22560 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
22570 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
22580 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
22590 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
225a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
225b0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
225c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
225d0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
225e0 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
225f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
22600 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72  Page;.  assertTr
22610 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
22620 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
22630 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22640 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
22650 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
22660 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
22670 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
22680 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
22690 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
226a0 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
226b0 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
226c0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
226d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
226e0 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
226f0 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
22700 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
22710 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
22720 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
22730 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
22740 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
22750 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
22760 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
22770 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
22780 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
22790 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
227a0 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
227b0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
227c0 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
227d0 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
227e0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
227f0 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
22800 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
22810 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
22820 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
22830 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
22840 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
22850 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
22860 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
22870 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
22880 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
22890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
228a0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
228b0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
228c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
228d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
228e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
228f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
22900 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
22910 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
22920 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
22930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22940 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
22950 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
22960 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
22970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
22980 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
22990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
229a0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
229b0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
229c0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
229d0 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
229e0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
229f0 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
22a00 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
22a10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
22a20 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
22a30 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
22a40 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
22a50 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
22a60 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
22a70 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
22a80 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
22a90 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
22aa0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
22ab0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
22ac0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
22ad0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
22ae0 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
22af0 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
22b00 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
22b10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
22b20 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
22b30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
22b40 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
22b50 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
22b60 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
22b70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
22b80 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
22b90 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
22ba0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
22bb0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
22bc0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
22bd0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
22be0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
22bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22c00 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
22c10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
22c20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
22c30 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
22c40 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
22c50 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
22c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
22c70 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
22c80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
22c90 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  rCode = 0; */.  
22ca0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
22cb0 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eMode = 0;.#ifnd
22cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
22cd0 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43  AL.  sqlite3WalC
22ce0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61  lose(pPager->pWa
22cf0 6c 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e  l,.    (pPager->
22d00 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61  noSync ? 0 : pPa
22d10 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
22d20 2c 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  , .    pPager->p
22d30 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20  ageSize, pTmp.  
22d40 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
22d50 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
22d60 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
22d70 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
22d80 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
22d90 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
22da0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
22db0 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
22dc0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
22dd0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
22de0 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
22df0 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
22e00 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
22e10 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
22e20 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
22e30 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
22e40 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
22e50 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
22e60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
22e70 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
22e80 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
22e90 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
22ea0 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
22eb0 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
22ec0 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
22ed0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
22ee0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
22ef0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
22f00 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
22f10 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
22f20 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
22f30 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
22f40 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
22f50 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
22f60 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
22f70 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
22f80 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
22f90 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
22fa0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
22fb0 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
22fc0 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
22fd0 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
22fe0 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
22ff0 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
23000 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
23010 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
23020 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
23030 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
23040 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
23050 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
23060 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
23070 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63  Pager, pagerSync
23080 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
23090 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
230a0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
230b0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
230c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
230d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
230e0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
230f0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
23100 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
23110 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
23120 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
23130 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
23140 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
23150 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
23160 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
23170 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
23180 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
23190 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
231a0 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  Tmp);.  sqlite3P
231b0 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
231c0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
231d0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
231e0 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67  CODEC.  if( pPag
231f0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
23200 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
23210 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
23220 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ec);.#endif..  a
23230 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
23240 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
23250 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
23260 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
23270 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
23280 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
23290 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
232a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
232b0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
232c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
232d0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
232e0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
232f0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
23300 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
23310 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
23320 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
23330 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
23340 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
23350 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
23360 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
23370 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
23380 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
23390 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
233a0 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
233b0 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
233c0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
233d0 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
233e0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
233f0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
23400 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
23410 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
23420 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
23430 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
23440 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
23450 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
23460 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
23470 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
23480 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
23490 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
234a0 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
234b0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
234c0 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
234d0 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  noSync flag is s
234e0 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
234f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
23500 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
23510 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
23520 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
23530 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
23540 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76   and the .** dev
23550 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
23560 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66  ics of the the f
23570 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
23580 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
23590 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
235a0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
235b0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
235c0 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
235d0 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
235e0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
235f0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
23600 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
23610 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
23620 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
23630 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
23640 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
23650 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
23660 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
23670 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
23680 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
23690 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
236a0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
236b0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
236c0 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
236d0 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
236e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
236f0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
23700 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
23710 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
23720 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
23730 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
23740 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
23750 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
23760 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
23770 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
23780 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
23790 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
237a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
237b0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
237c0 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
237d0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
237e0 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
237f0 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
23800 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
23810 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
23820 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
23830 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
23840 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
23850 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
23860 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
23870 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
23880 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
23890 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
238a0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
238b0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
238c0 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
238d0 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
238e0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
238f0 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
23900 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
23910 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
23920 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
23930 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
23940 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
23950 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
23960 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
23970 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
23980 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
23990 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
239a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
239b0 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
239c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
239f0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
23a00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
23a10 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
23a20 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
23a30 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
23a40 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
23a50 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
23a60 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
23a70 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
23a80 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
23a90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
23aa0 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
23ab0 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
23ac0 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
23ad0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23ae0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
23af0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
23b00 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
23b10 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
23b20 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
23b30 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23b40 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
23b50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
23b60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
23b70 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
23b80 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
23b90 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
23ba0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
23bb0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
23bc0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
23bd0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
23be0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
23bf0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
23c00 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
23c10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
23c20 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
23c30 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
23c40 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
23c50 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
23c60 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
23c70 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
23c80 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
23c90 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
23ca0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
23cb0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
23cc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23cd0 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
23ce0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
23cf0 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
23d00 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
23d10 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
23d20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
23d30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
23d40 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
23d50 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
23d60 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
23d70 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
23d80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
23d90 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
23da0 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
23db0 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
23dc0 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
23dd0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
23de0 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
23df0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
23e00 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
23e10 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
23e20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
23e30 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
23e40 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
23e50 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
23e60 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
23e70 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
23e80 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
23e90 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
23ea0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
23eb0 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
23ec0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
23ed0 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
23ee0 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
23ef0 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
23f00 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
23f10 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
23f20 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
23f30 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
23f40 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
23f50 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
23f60 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
23f70 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
23f80 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
23f90 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
23fa0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
23fb0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
23fc0 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
23fd0 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
23fe0 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
23ff0 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
24000 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
24010 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
24020 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
24030 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
24040 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
24050 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
24060 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
24070 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
24080 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
24090 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
240a0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
240b0 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
240c0 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
240d0 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
240e0 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
240f0 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
24100 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
24110 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
24120 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
24130 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
24140 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
24150 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
24160 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
24170 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
24180 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
24190 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
241a0 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
241b0 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
241c0 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
241d0 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
241e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
241f0 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
24200 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
24210 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
24220 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
24230 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
24240 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
24250 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
24260 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
24270 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
24280 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
24290 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
242a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
242b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
242c0 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
242d0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
242e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
242f0 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
24300 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
24310 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
24320 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
24330 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
24340 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
24350 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
24360 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
24370 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
24380 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
24390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
243a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
243b0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
243c0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
243d0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
243e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
243f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
24400 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
24410 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
24420 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
24430 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
24440 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
24450 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
24460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
24470 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
24480 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
24490 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
244a0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
244b0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
244c0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
244d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
244e0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
244f0 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
24500 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
24510 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
24520 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
24530 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
24540 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
24550 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
24560 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
24570 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
24580 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
24590 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
245a0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
245b0 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
245c0 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
245d0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
245e0 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
245f0 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
24600 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
24610 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
24620 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
24630 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
24640 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
24650 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24660 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
24670 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
24680 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
24690 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
246a0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
246b0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
246c0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
246d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
246e0 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
246f0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
24700 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
24710 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24720 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
24730 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
24740 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
24750 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
24760 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
24770 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
24780 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
24790 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
247a0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
247b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
247c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
247d0 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
247e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
247f0 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
24800 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
24810 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
24820 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
24830 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
24840 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
24850 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
24860 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
24870 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
24880 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
24890 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
248a0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
248b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
248c0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
248d0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
248e0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
248f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24900 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
24910 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
24920 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20  >sync_flags| .  
24930 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
24940 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c  >sync_flags==SQL
24950 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
24960 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
24970 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
24980 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
24990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
249a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
249b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
249c0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
249d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
249e0 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
249f0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
24a00 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
24a10 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
24a20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
24a30 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
24a40 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
24a50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
24a60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24a70 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
24a80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
24a90 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
24aa0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
24ab0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
24ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24ad0 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
24ae0 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
24af0 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
24b00 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
24b10 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
24b20 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
24b30 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
24b40 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
24b50 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
24b60 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
24b70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
24b80 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
24b90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
24ba0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
24bb0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
24bc0 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
24bd0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
24be0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
24bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
24c10 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
24c20 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
24c30 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
24c40 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
24c50 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
24c60 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
24c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
24c80 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
24c90 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
24ca0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
24cb0 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
24cc0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
24cd0 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
24ce0 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
24cf0 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
24d00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
24d10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
24d20 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
24d30 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
24d40 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
24d50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
24d60 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24d70 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
24d80 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
24d90 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
24da0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
24db0 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
24dc0 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
24dd0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
24de0 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
24df0 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
24e00 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
24e10 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
24e20 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
24e30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
24e40 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
24e50 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
24e60 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
24e70 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
24e80 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
24e90 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
24ea0 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
24eb0 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
24ec0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
24ed0 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
24ee0 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
24ef0 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
24f00 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
24f10 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
24f20 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
24f30 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
24f40 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
24f50 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
24f60 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
24f70 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
24f80 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
24f90 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
24fa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
24fb0 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
24fc0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
24fd0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
24fe0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
24ff0 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
25000 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
25010 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
25020 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
25030 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
25040 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
25050 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
25060 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
25070 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
25080 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
25090 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
250a0 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
250b0 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
250c0 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
250d0 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
250e0 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
250f0 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
25100 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
25110 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
25120 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
25130 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
25140 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25150 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
25160 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
25170 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
25180 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
25190 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
251a0 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
251b0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
251c0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
251d0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
251e0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
251f0 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
25200 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
25210 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
25220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25240 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25250 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
25260 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25270 73 20 63 61 6c 6c 65 64 20 69 6e 20 57 52 49 54  s called in WRIT
25280 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 0a  ER_DBMOD state..
25290 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
252a0 72 20 69 74 20 6d 61 79 20 62 65 20 63 61 6c 6c  r it may be call
252b0 65 64 20 69 6e 20 57 52 49 54 45 52 5f 43 41 43  ed in WRITER_CAC
252c0 48 45 4d 4f 44 20 73 74 61 74 65 20 69 66 20 74  HEMOD state if t
252d0 68 65 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20  he page being.  
252e0 2a 2a 20 77 72 69 74 74 65 6e 20 28 61 6e 64 20  ** written (and 
252f0 61 6c 6c 20 6f 74 68 65 72 20 70 61 67 65 73 20  all other pages 
25300 74 68 61 74 20 72 65 73 69 64 65 20 6f 6e 20 74  that reside on t
25310 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63  he same disk sec
25320 74 6f 72 29 20 77 61 73 0a 20 20 2a 2a 20 61 20  tor) was.  ** a 
25330 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
25340 61 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74  age at the start
25350 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
25360 69 6f 6e 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ion. In that cas
25370 65 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  e.  ** the datab
25380 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
25390 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 64  really being mod
253a0 69 66 69 65 64 2c 20 73 6f 20 69 74 20 69 73 20  ified, so it is 
253b0 4f 6b 20 74 6f 20 77 72 69 74 65 0a 20 20 2a 2a  Ok to write.  **
253c0 20 74 6f 20 69 74 20 69 6e 20 43 41 43 48 45 4d   to it in CACHEM
253d0 4f 44 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OD state..  */. 
253e0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
253f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
25400 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25410 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
25420 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
25430 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
25440 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
25450 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20  ITER_CACHEMOD . 
25460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25470 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
25480 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
25490 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 69   .       || (pLi
254a0 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 26 26  st->pDirty==0 &&
254b0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
254c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
254d0 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 74 20  ).  );..  /* At 
254e0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
254f0 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
25500 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
25510 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
25520 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
25530 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
25540 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
25550 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
25560 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
25570 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
25580 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
25590 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
255a0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
255b0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
255c0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
255d0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
255e0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
255f0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
25600 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
25610 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
25620 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
25630 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
25640 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
25650 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
25660 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
25670 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
25680 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
25690 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
256a0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
256b0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
256c0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
256d0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
256e0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
256f0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
25700 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
25710 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
25720 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
25730 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
25740 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
25750 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
25760 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
25770 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
25780 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
25790 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
257a0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
257b0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
257c0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
257d0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
257e0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
257f0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
25800 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
25810 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
25820 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
25830 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
25840 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
25850 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
25860 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20  VE_LOCK);..  /* 
25870 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
25880 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
25890 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
258a0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
258b0 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
258c0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
258d0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
258e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
258f0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
25900 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
25910 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
25920 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
25930 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
25940 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
25950 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
25960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25970 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
25980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
25990 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
259a0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
259b0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
259c0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
259d0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
259e0 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
259f0 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
25a00 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
25a10 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
25a20 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
25a30 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
25a40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
25a50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
25a60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25a70 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
25a80 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67 65 72 2d  ->dbSize>pPager-
25a90 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
25aa0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
25ab0 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72   szFile = pPager
25ac0 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
25ad0 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67  lite3_int64)pPag
25ae0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
25af0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
25b00 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
25b10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
25b20 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
25b30 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
25b40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25b50 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
25b60 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
25b70 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
25b80 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
25b90 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
25ba0 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
25bb0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
25bc0 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
25bd0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
25be0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
25bf0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
25c00 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
25c10 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
25c20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
25c30 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
25c40 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
25c50 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
25c60 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
25c70 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
25c80 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
25c90 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
25ca0 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
25cb0 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
25cc0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
25cd0 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
25ce0 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
25cf0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
25d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25d10 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
25d20 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
25d30 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
25d40 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
25d50 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
25d60 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
25d70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
25d80 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
25d90 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
25da0 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25dd0 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
25de0 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
25df0 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
25e00 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
25e10 4e 43 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  NC)==0 );..     
25e20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
25e30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
25e40 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
25e50 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
25e60 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
25e70 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
25e80 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
25e90 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
25ea0 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
25eb0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
25ec0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
25ed0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
25ee0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
25ef0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
25f00 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
25f10 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
25f20 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
25f30 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
25f40 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
25f50 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
25f60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
25f70 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
25f80 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
25f90 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
25fa0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
25fb0 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
25fc0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
25fd0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
25fe0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
25ff0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
26000 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
26010 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
26020 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
26030 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
26040 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
26050 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
26060 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
26070 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
26080 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
26090 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
260a0 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
260b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
260c0 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
260d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
260e0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
260f0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
26100 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
26110 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
26120 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
26130 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
26140 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
26150 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
26160 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
26170 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
26180 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
26190 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
261a0 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
261b0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
261c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
261d0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
261e0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
261f0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
26200 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
26210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
26220 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
26230 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
26240 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
26250 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
26260 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
26270 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
26280 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
26290 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
262a0 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
262b0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
262c0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
262d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
262e0 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
262f0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26300 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
26310 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
26320 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
26330 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26340 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
26350 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26360 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
26370 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
26380 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
26390 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
263a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
263b0 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
263c0 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
263d0 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
263e0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
263f0 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
26400 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26420 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
26430 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
26440 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
26450 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
26460 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
26470 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
26480 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
26490 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
264a0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
264b0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
264c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
264d0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
264e0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
264f0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
26500 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
26510 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26520 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
26530 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
26540 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
26550 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
26560 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
26570 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
26580 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
26590 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
265a0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
265b0 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
265c0 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
265d0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
265e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
265f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
26600 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
26610 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
26620 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
26630 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
26640 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
26650 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
26660 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
26670 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
26680 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
26690 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
266a0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
266b0 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
266c0 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
266d0 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
266e0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
266f0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
26700 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
26710 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
26720 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
26730 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
26740 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
26750 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
26760 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
26770 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
26780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
26790 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
267a0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
267b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
267c0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
267d0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
267e0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
267f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
26800 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
26810 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
26820 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
26830 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
26840 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
26850 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
26860 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
26870 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
26880 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
26890 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
268a0 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
268b0 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
268c0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
268d0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
268e0 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
268f0 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20  nal(pPg) .      
26900 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
26910 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
26920 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
26930 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
26940 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
26950 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
26960 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
26970 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
26980 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
26990 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
269a0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
269b0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
269c0 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
269d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
269e0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
269f0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
26a00 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
26a10 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  et = pPager->nSu
26a20 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
26a30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
26a40 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
26a50 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
26a60 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
26a70 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
26a80 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
26a90 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
26aa0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
26ab0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
26ac0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
26ad0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
26ae0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
26af0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
26b00 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
26b10 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
26b20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26b50 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
26b60 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
26b70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
26b80 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
26b90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
26ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26bb0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
26bc0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
26bd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
26be0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
26bf0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
26c00 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
26c10 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
26c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
26c40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26c50 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
26c60 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
26c70 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
26c80 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
26c90 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
26ca0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
26cb0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
26cc0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
26cd0 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
26ce0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
26cf0 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
26d00 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
26d10 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
26d20 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
26d30 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
26d40 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
26d50 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
26d60 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
26d70 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
26d80 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
26d90 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
26da0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26db0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
26dc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
26dd0 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
26de0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
26df0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
26e00 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
26e10 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
26e20 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
26e30 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
26e40 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
26e50 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
26e60 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
26e70 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
26e80 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
26e90 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
26ea0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
26eb0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
26ec0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
26ed0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
26ee0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
26ef0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
26f00 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
26f10 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
26f20 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
26f30 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
26f40 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
26f50 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
26f60 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
26f70 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
26f80 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
26f90 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
26fa0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
26fb0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
26fc0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
26fd0 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
26fe0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
26ff0 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
27000 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
27010 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
27020 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
27030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27040 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
27050 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
27060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
27070 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
27080 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
27090 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
270a0 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69  flag is set duri
270b0 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
270c0 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
270d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
270e0 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
270f0 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
27100 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
27110 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
27120 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
27130 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
27140 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
27150 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
27160 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
27170 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
27180 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
27190 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
271a0 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ag inhibits all 
271b0 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72  cache spilling r
271c0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
271d0 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
271e0 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
271f0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
27200 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  t during a rollb
27210 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ack..  **.  ** S
27220 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
27230 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  inhibited when i
27240 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
27250 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
27260 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
27270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27280 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
27290 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75  oNotSpill ) retu
272a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
272b0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
272c0 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70  tSyncSpill && (p
272d0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
272e0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
272f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27300 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
27310 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
27320 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
27330 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
27340 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
27350 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
27360 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
27370 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  og. */.    if( s
27380 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
27390 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72  pPg) ){ .      r
273a0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
273b0 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a  ge(pPg); .    }.
273c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
273d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
273e0 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
273f0 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
27400 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
27410 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
27420 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
27430 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
27440 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
27450 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
27460 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
27470 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
27480 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
27490 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
274a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
274b0 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
274c0 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
274d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
274e0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
274f0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
27500 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
27510 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
27520 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
27530 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
27540 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
27550 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
27560 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
27570 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
27580 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
27590 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
275a0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
275b0 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
275c0 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
275d0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
275e0 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
275f0 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
27600 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
27610 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
27620 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
27630 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
27640 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
27650 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
27660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
27670 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
27680 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
27690 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
276a0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
276b0 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
276c0 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
276d0 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
276e0 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
276f0 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
27700 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
27710 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
27720 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
27730 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
27740 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
27750 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
27760 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
27770 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
27780 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
27790 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
277a0 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
277b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
277c0 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
277d0 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
277e0 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
277f0 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
27800 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
27810 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
27820 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
27830 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
27840 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
27850 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
27860 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
27870 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
27880 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
27890 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
278a0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
278b0 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
278c0 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
278d0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
278e0 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
278f0 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
27900 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
27910 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
27920 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
27930 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
27940 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
27950 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
27960 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
27970 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
27980 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
27990 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
279a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
279b0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
279c0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
279d0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
279e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
279f0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
27a00 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
27a10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27a20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
27a30 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
27a40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
27a50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
27a60 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
27a70 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
27a80 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
27a90 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
27aa0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
27ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
27ad0 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
27ae0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
27af0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
27b00 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
27b10 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
27b20 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
27b30 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
27b40 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
27b50 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  c);.}.../*.** Al
27b60 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
27b70 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
27b80 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
27b90 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
27ba0 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
27bb0 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
27bc0 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
27bd0 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
27be0 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
27bf0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
27c00 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
27c10 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
27c20 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
27c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
27c40 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
27c50 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
27c60 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
27c70 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
27c80 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
27c90 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
27ca0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
27cb0 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
27cc0 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
27cd0 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
27ce0 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
27cf0 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
27d00 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
27d10 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
27d20 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
27d30 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
27d40 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
27d50 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
27d60 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
27d70 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
27d80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
27d90 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
27da0 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
27db0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
27dc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
27dd0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
27de0 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
27df0 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
27e00 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
27e10 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
27e20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
27e30 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
27e40 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
27e50 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
27e60 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
27e70 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
27e80 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
27e90 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
27ea0 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
27eb0 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
27ec0 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
27ed0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
27ee0 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f  * of the PAGER_O
27ef0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
27f00 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
27f10 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  K flags..**.** T
27f20 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
27f30 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
27f40 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
27f50 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
27f60 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
27f70 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
27f80 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
27f90 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
27fa0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
27fb0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
27fc0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
27fd0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
27fe0 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
27ff0 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
28000 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
28010 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
28020 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
28030 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
28040 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
28050 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
28060 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
28070 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
28080 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
28090 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
280a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
280b0 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
280c0 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
280d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
280e0 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
280f0 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
28100 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
28110 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
28120 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
28130 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
28140 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
28150 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
28160 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
28170 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
28180 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
28190 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
281a0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
281b0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
281c0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
281d0 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
281e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
281f0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
28200 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
28210 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
28220 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
28230 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
28240 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
28250 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
28260 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
28270 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
28280 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
28290 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
282a0 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
282b0 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
282c0 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
282d0 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
282e0 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
282f0 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
28300 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
28310 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
28320 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
28330 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
28340 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
28350 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
28360 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
28370 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
28380 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28390 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
283a0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
283b0 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
283c0 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
283d0 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
283e0 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
283f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28400 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
28410 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
28420 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
28430 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
28440 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
28450 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
28460 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
28470 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
28480 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
28490 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
284a0 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
284b0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
284c0 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
284d0 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
284e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
284f0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
28500 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28510 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
28520 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
28530 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
28540 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
28550 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
28560 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
28570 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65  al */.  int noRe
28580 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
28590 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
285a0 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75  OCK)!=0;  /* Tru
285b0 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c  e to omit read-l
285c0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  ock */.  int pca
285d0 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
285e0 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
285f0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
28600 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
28610 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a  ache */.  u16 sz
28620 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
28630 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
28640 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
28650 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   page size */.. 
28660 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
28670 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
28680 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
28690 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
286a0 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
286b0 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
286c0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
286d0 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
286e0 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
286f0 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
28700 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
28710 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
28720 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
28730 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
28740 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
28750 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
28760 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
28770 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
28780 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
28790 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
287a0 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
287b0 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
287c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
287d0 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
287e0 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
287f0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
28800 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
28810 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
28820 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
28830 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
28840 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
28850 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
28860 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
28870 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
28880 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
28890 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
288a0 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
288b0 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
288c0 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
288d0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
288e0 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
288f0 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
28900 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
28910 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
28920 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
28930 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
28940 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
28950 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
28960 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
28970 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
28980 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
28990 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
289a0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
289b0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
289c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
289d0 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
289e0 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
289f0 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
28a00 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
28a10 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
28a20 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e  name[0] ){.    n
28a30 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
28a40 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
28a50 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
28a60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61  qlite3Malloc(nPa
28a70 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
28a80 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
28a90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28aa0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28ab0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
28ac0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
28ad0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
28ae0 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
28af0 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
28b00 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
28b10 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
28b20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  = 0;.    }else.#
28b30 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
28b40 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
28b50 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
28b60 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
28b70 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
28b80 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
28b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28ba0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
28bb0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
28bc0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
28bd0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
28be0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
28bf0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
28c00 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
28c10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28c20 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
28c30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
28c40 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
28c50 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
28c60 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
28c70 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
28c80 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
28c90 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
28ca0 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
28cb0 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
28cc0 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
28cd0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
28ce0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
28cf0 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
28d00 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
28d10 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
28d20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
28d30 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
28d40 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
28d50 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
28d60 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
28d70 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
28d80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28d90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
28da0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
28db0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
28dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28dd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
28de0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
28df0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
28e00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
28e10 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
28e20 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
28e30 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
28e40 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
28e50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
28e60 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
28e70 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
28e80 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
28e90 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
28ea0 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
28eb0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
28ec0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
28ed0 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
28ef0 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
28f00 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
28f10 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
28f30 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
28f40 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
28f50 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
28f60 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
28f70 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
28f80 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
28f90 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
28fa0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
28fb0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
28fc0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
28fd0 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
28fe0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
28ff0 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
29000 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
29010 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
29020 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
29030 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
29040 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
29050 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
29060 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
29070 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
29080 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
29090 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
290a0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
290b0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
290c0 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
290d0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
290e0 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
290f0 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
29100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
29110 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
29120 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
29130 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
29140 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
29150 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
29160 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
29170 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
29180 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
29190 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
291a0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  hname + 1 +     
291b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
291c0 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
291d0 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31  Pathname + 8 + 1
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
291f0 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
29200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29210 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
29220 6e 61 6d 65 20 2b 20 34 20 2b 20 31 20 20 20 20  name + 4 + 1    
29230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61            /* zWa
29240 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b  l */.#endif.  );
29250 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
29260 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
29270 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
29280 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
29290 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
292a0 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
292b0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
292c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
292d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
292e0 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
292f0 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
29300 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
29310 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
29320 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
29330 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
29340 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
29350 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
29360 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
29370 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
29380 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
29390 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
293a0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
293b0 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
293c0 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
293d0 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
293e0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
293f0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
29400 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
29410 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
29420 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
29430 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
29440 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
29450 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
29460 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
29470 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
29480 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
29490 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
294a0 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
294b0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
294c0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
294d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
294e0 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
294f0 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
29500 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65  ame + 1);.    me
29510 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
29520 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
29530 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
29540 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
29550 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
29560 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
29570 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
29580 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
29590 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
295a0 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20  urnal", 8);.    
295b0 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  if( pPager->zFil
295c0 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20  ename[0]==0 ){. 
295d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f       pPager->zJo
295e0 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
295f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
29600 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
29610 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
29620 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
29630 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
29640 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
29650 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
29660 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ->zWal, zPathnam
29670 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
29680 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
29690 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e  ger->zWal[nPathn
296a0 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29  ame], "-wal", 4)
296b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
296c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
296d0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
296e0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
296f0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
29700 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
29710 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
29720 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
29730 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
29740 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
29750 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
29760 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
29770 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
29780 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
29790 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
297a0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
297b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
297c0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
297d0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
297e0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
297f0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
29800 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
29810 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
29820 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
29830 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
29840 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
29850 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
29860 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
29870 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
29880 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
29890 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
298a0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
298b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
298c0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
298d0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
298e0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
298f0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
29900 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
29910 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
29920 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
29930 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
29940 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
29950 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
29960 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
29970 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
29980 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
29990 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
299a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
299b0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
299c0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
299d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
299e0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
299f0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
29a00 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
29a10 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
29a20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
29a30 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
29a40 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
29a50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
29a60 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
29a70 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
29a80 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
29a90 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
29aa0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
29ab0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
29ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29ad0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
29ae0 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
29af0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
29b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
29b10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
29b20 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
29b30 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
29b40 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
29b50 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
29b60 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
29b70 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
29b80 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
29b90 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
29ba0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
29bb0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
29bc0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
29bd0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
29be0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
29bf0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
29c00 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
29c10 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
29c20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
29c30 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
29c40 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
29c50 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
29c60 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
29c70 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
29c80 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
29c90 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
29ca0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
29cb0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
29cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29cd0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29ce0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
29cf0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
29d00 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
29d10 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
29d20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
29d30 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
29d40 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
29d50 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
29d60 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
29d70 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
29d80 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
29d90 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
29da0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
29db0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
29dc0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
29dd0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
29de0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
29df0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
29e00 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
29e10 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
29e20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
29e30 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
29e40 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
29e50 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
29e60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
29e70 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
29e80 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
29e90 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
29ea0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
29eb0 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
29ec0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
29ed0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
29ee0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
29ef0 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
29f00 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
29f10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
29f20 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
29f30 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
29f40 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
29f50 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
29f60 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
29f70 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
29f80 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
29f90 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
29fa0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
29fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29fd0 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
29fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29ff0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2a000 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2a010 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2a020 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2a030 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2a040 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2a050 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
2a060 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
2a070 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
2a080 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
2a090 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2a0a0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2a0b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a0c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2a0d0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2a0e0 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
2a0f0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2a100 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2a110 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2a120 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2a130 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2a140 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2a150 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ject. */.  asser
2a160 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2a170 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55  ;.  nExtra = ROU
2a180 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ND8(nExtra);.  s
2a190 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2a1a0 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2a1b0 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2a1e0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2a1f0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2a200 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
2a210 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2a220 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2a230 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2a240 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2a250 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2a260 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2a270 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2a280 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2a290 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2a2a0 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2a2b0 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
2a2c0 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f  noReadlock = (no
2a2d0 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
2a2e0 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a  Only) ?1:0;.  /*
2a2f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2a300 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2a310 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2a320 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2a330 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2a340 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2a350 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2a360 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2a370 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2a380 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2a390 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2a3a0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2a3b0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2a3c0 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2a3d0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2a3e0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30  UNLOCK; */.#if 0
2a3f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a400 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d  r->state == (tem
2a410 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58  pFile ? PAGER_EX
2a420 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f  CLUSIVE : PAGER_
2a430 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69  UNLOCK) );.#endi
2a440 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  f.  /* pPager->e
2a450 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2a460 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2a470 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2a480 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2a490 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2a4a0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2a4b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2a4c0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2a4d0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2a4e0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2a4f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2a500 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2a510 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2a520 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2a530 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2a540 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2a550 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2a560 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2a570 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2a580 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2a590 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2a5a0 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2a5b0 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2a5c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2a5d0 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2a5e0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2a5f0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2a600 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
2a610 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
2a620 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
2a630 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
2a640 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2a650 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2a660 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
2a670 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
2a680 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
2a690 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
2a6a0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2a6b0 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
2a6c0 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
2a6d0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
2a6e0 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
2a6f0 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
2a700 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
2a710 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a720 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
2a730 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
2a740 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
2a750 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29  f( !useJournal )
2a760 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2a770 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2a780 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2a790 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  F;.  }else if( m
2a7a0 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
2a7b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2a7c0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2a7d0 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
2a7e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
2a7f0 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
2a800 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2a810 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
2a820 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2a830 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
2a840 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  init;.  /* memse
2a850 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
2a860 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
2a870 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a  r->aHash)); */..
2a880 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2a890 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2a8a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a  LITE_OK;.}..../*
2a8b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a8c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2a8d0 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2a8e0 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2a8f0 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2a900 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2a910 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2a920 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2a930 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2a940 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2a950 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2a960 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2a970 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2a980 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2a990 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2a9a0 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2a9b0 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2a9c0 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2a9d0 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2a9e0 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2a9f0 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2aa00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2aa10 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2aa20 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2aa30 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2aa40 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2aa50 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2aa60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2aa70 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2aa80 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2aa90 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2aaa0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2aab0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2aac0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2aad0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2aae0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2aaf0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2ab00 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2ab10 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2ab20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ab30 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2ab40 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2ab50 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2ab60 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2ab70 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2ab80 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2ab90 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2aba0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2abb0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2abc0 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2abd0 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2abe0 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2abf0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2ac00 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2ac10 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2ac20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ac30 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2ac40 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2ac50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2ac60 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2ac70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2ac80 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2ac90 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2aca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2acb0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2acc0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2acd0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2ace0 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2acf0 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2ad00 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2ad10 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2ad20 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2ad30 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2ad40 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2ad50 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2ad60 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2ad70 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2ad80 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2ad90 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2ada0 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2adb0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2adc0 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2add0 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2ade0 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2adf0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2ae00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2ae10 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2ae20 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2ae30 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2ae40 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2ae50 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2ae60 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2ae70 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2ae80 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2ae90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2aea0 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2aeb0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2aec0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2aed0 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2aee0 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2aef0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2af00 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2af10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2af20 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2af30 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2af40 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2af50 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2af60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2af70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2af80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2af90 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2afa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2afb0 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2afc0 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2afd0 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2afe0 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2aff0 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2b000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2b010 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2b020 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2b030 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2b040 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2b050 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2b060 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2b070 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2b080 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2b090 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2b0a0 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2b0b0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2b0c0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2b0d0 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2b0e0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2b0f0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2b100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b110 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2b120 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2b130 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2b140 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2b150 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2b160 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2b170 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2b180 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2b190 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2b1a0 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2b1b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2b1c0 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2b1d0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2b1e0 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2b1f0 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2b200 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2b210 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2b220 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2b230 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
2b240 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
2b250 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
2b260 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
2b270 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
2b280 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
2b290 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
2b2a0 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
2b2b0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2b2c0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2b2d0 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
2b2e0 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
2b2f0 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
2b300 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
2b310 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
2b320 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2b330 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
2b340 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
2b350 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
2b360 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
2b370 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
2b380 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
2b390 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
2b3a0 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
2b3b0 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
2b3c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2b3d0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2b3e0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
2b3f0 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
2b400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b410 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
2b420 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
2b430 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2b440 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b450 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2b460 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
2b470 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
2b480 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2b490 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
2b4a0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70   consists of 0 p
2b4b0 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ages,.      ** t
2b4c0 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2b4d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65  ournal file. See
2b4e0 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
2b4f0 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20  ent above for . 
2b500 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73       ** the reas
2b510 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c  oning here.  Del
2b520 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65  ete the obsolete
2b530 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e   journal file un
2b540 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52  der.      ** a R
2b550 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
2b560 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69  avoid race condi
2b570 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f  tions and to avo
2b580 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20  id violating.   
2b590 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a     ** [H33020]..
2b5a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b5b0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2b5c0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2b5d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2b5e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b5f0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
2b600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b610 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
2b620 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2b630 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
2b640 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
2b650 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
2b660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2b680 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
2b690 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2b6a0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2b6b0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
2b6c0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
2b6d0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
2b6e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b6f0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
2b700 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
2b710 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2b720 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2b730 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
2b740 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2b750 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
2b760 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
2b770 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2b780 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b790 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
2b7a0 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
2b7b0 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
2b7c0 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
2b7d0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
2b7e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b7f0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
2b800 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
2b810 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
2b820 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
2b830 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
2b840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
2b850 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
2b860 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2b870 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
2b880 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2b890 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
2b8a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2b8b0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
2b8c0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
2b8d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b8e0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2b8f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2b900 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2b910 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
2b920 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2b930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
2b950 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
2b960 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2b970 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
2b980 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
2b990 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b9b0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
2b9c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
2b9e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2b9f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ba00 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
2ba10 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
2ba20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
2ba30 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
2ba40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
2ba60 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
2ba70 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
2ba80 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2ba90 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
2baa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2bab0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
2bac0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
2bad0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
2bae0 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
2baf0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
2bb00 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
2bb10 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
2bb20 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
2bb30 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
2bb40 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
2bb50 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
2bb60 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
2bb70 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
2bb80 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
2bb90 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
2bba0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
2bbb0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
2bbc0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
2bbd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
2bbe0 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
2bbf0 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
2bc00 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
2bc10 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
2bc20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
2bc30 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
2bc40 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
2bc50 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
2bc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2bc70 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
2bc80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2bc90 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
2bca0 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
2bcb0 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
2bcc0 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
2bcd0 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
2bce0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2bcf0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
2bd00 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2bd10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bd20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bd30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2bd40 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2bd50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2bd60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2bd70 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
2bd80 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
2bd90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2bda0 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ile..** It is il
2bdb0 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
2bdc0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
2bdd0 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  e() until after 
2bde0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2bdf0 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2be00 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
2be10 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
2be20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
2be30 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
2be40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2be50 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
2be60 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
2be70 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
2be80 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
2be90 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2bea0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
2beb0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
2bec0 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
2bed0 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28  R_UNLOCK state (
2bee0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
2bef0 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
2bf00 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
2bf10 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
2bf20 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
2bf30 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
2bf40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2bf50 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
2bf60 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
2bf70 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
2bf80 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
2bf90 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
2bfa0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
2bfb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
2bfc0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
2bfd0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
2bfe0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
2bff0 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
2c000 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
2c010 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
2c020 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
2c030 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
2c040 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
2c050 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
2c060 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
2c070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2c080 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
2c090 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
2c0a0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
2c0b0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
2c0c0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
2c0d0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
2c0e0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
2c0f0 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
2c100 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
2c110 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
2c120 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
2c130 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
2c140 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
2c150 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
2c160 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
2c170 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
2c180 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
2c190 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
2c1a0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
2c1b0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
2c1c0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
2c1d0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
2c1e0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
2c1f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2c200 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72   operation descr
2c210 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76  ibed by (2) abov
2c220 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  e is not attempt
2c230 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a  ed, and if the.*
2c240 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  * pager is in an
2c250 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
2c260 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
2c270 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73  ULL when this is
2c280 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20   called,.** the 
2c290 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
2c2a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2c2b0 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74  ed. It is permit
2c2c0 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a  ted to read the.
2c2d0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  ** database when
2c2e0 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   in SQLITE_FULL 
2c2f0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
2c300 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2c310 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2c320 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2c330 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2c340 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72  . If an.** IO er
2c350 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2c360 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
2c370 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
2c380 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2c390 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c  l.** file or rol
2c3a0 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
2c3b0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
2c3c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2c3d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2c3e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
2c3f0 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
2c400 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2c410 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2c420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c430 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2c440 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2c450 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2c460 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
2c470 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
2c480 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
2c490 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
2c4a0 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
2c4b0 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
2c4c0 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
2c4d0 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
2c4e0 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
2c4f0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
2c500 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
2c510 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
2c520 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
2c530 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
2c540 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
2c550 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2c560 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
2c570 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
2c580 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2c590 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
2c5a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2c5b0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
2c5c0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2c5d0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
2c5e0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
2c5f0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
2c600 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
2c610 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2c620 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
2c630 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2c640 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
2c650 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2c660 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
2c670 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
2c680 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c690 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
2c6a0 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
2c6b0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2c6c0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
2c6d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52  ert( pPager->noR
2c6e0 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50  eadlock==0 || pP
2c6f0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
2c700 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
2c710 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2c720 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2c730 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2c740 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
2c750 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
2c760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c770 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2c780 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2c790 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
2c7a0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
2c7b0 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
2c7c0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2c7d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2c7e0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
2c7f0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2c800 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
2c810 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2c820 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
2c830 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
2c840 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
2c850 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2c860 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
2c870 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2c880 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
2c890 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
2c8a0 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
2c8b0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
2c8c0 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
2c8d0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2c8e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c8f0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2c900 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
2c910 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
2c920 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
2c930 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
2c940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c950 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
2c960 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
2c970 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
2c980 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2c990 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
2c9a0 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
2c9b0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
2c9c0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
2c9d0 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
2c9e0 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
2c9f0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
2ca00 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
2ca10 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2ca20 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
2ca30 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
2ca40 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
2ca50 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
2ca60 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
2ca70 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
2ca80 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
2ca90 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
2caa0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2cab0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
2cac0 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
2cad0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
2cae0 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
2caf0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
2cb00 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
2cb10 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
2cb20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
2cb30 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
2cb40 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
2cb50 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
2cb60 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
2cb70 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
2cb80 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
2cb90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2cba0 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ile..      **.  
2cbb0 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68      ** Unless th
2cbc0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f  e pager is in lo
2cbd0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
2cbe0 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c  sive mode, the l
2cbf0 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ock is.      ** 
2cc00 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48  downgraded to SH
2cc10 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65  ARED_LOCK before
2cc20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2cc30 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f  eturns..      */
2cc40 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2cc50 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2cc60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2cc70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2cc80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc90 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2cca0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
2ccb0 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   /* If it is not
2ccc0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e   already open an
2ccd0 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  d the file exist
2cce0 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20  s on disk, open 
2ccf0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  the .      ** jo
2cd00 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
2cd10 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69  rite access. Wri
2cd20 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71  te access is req
2cd30 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20  uired because . 
2cd40 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75       ** in exclu
2cd50 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
2cd60 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2cd70 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
2cd80 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a  t open .      **
2cd90 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73   and possibly us
2cda0 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
2cdb0 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41  tion later on. A
2cdc0 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73  lso, write-acces
2cdd0 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  s .      ** is u
2cde0 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  sually required 
2cdf0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2ce00 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e  journal in journ
2ce10 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20  al_mode=persist 
2ce20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28  .      ** mode (
2ce30 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75  and also for jou
2ce40 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61  rnal_mode=trunca
2ce50 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  te on some syste
2ce60 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ms)..      **.  
2ce70 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f      ** If the jo
2ce80 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
2ce90 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
2cea0 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
2ceb0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72   .      ** other
2cec0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61   connection mana
2ced0 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e  ged to get in an
2cee0 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62  d roll it back b
2cef0 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  efore .      ** 
2cf00 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
2cf10 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63  obtained the exc
2cf20 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76  lusive lock abov
2cf30 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20  e. Or, it .     
2cf40 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
2cf50 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
2cf60 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
2cf70 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
2cf80 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
2cf90 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
2cfa0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
2cfb0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
2cfc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2cfd0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2cfe0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2cff0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2d000 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2d010 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20  ger->pVfs;.     
2d020 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20     int bExists; 
2d030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d040 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
2d050 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
2d060 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d070 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
2d080 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
2d090 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2d0a0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2d0b0 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29  XISTS, &bExists)
2d0c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2d0d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2d0e0 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
2d0f0 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
2d100 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2d110 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
2d120 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2d130 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2d140 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
2d150 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2d160 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
2d170 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d180 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2d190 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2d1a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2d1b0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
2d1c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2d1d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2d1e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2d1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d210 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
2d220 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
2d230 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d240 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2d250 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2d260 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2d270 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2d280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d290 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
2d2a0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
2d2b0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
2d2c0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
2d2d0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
2d2e0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
2d2f0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
2d300 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
2d310 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
2d320 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
2d330 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
2d340 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
2d350 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
2d360 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
2d370 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
2d380 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
2d390 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
2d3a0 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
2d3b0 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
2d3c0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
2d3d0 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
2d3e0 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
2d3f0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
2d400 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
2d410 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
2d420 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
2d430 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
2d440 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
2d450 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
2d460 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
2d470 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2d480 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2d490 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d4a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2d4b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2d4c0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
2d4d0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
2d4e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d500 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2d510 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
2d520 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2d530 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2d540 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
2d550 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2d560 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
2d570 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
2d580 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
2d590 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2d5a0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
2d5b0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
2d5c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d5d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2d5e0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
2d5f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2d600 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2d610 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
2d620 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
2d630 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
2d640 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
2d650 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
2d660 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
2d670 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
2d680 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
2d690 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2d6a0 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
2d6b0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
2d6c0 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
2d6d0 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
2d6e0 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
2d6f0 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
2d700 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
2d710 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
2d720 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
2d730 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
2d740 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
2d750 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
2d760 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
2d770 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
2d780 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
2d790 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
2d7a0 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
2d7b0 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
2d7c0 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
2d7d0 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
2d7e0 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
2d7f0 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
2d800 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
2d810 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
2d820 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
2d830 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
2d840 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
2d850 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
2d860 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2d870 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
2d880 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
2d890 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
2d8a0 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
2d8b0 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
2d8c0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
2d8d0 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
2d8e0 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
2d8f0 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
2d900 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
2d910 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
2d920 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
2d930 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
2d940 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
2d950 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
2d960 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
2d970 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
2d980 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
2d990 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2d9a0 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
2d9b0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2d9c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2d9d0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
2d9e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d9f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2da00 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
2da10 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
2da20 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
2da30 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
2da40 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
2da50 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
2da60 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
2da70 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
2da80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2da90 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2daa0 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
2dab0 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73  er->pBackup || s
2dac0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2dad0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2dae0 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29  Cache)>0) .    )
2daf0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
2db00 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
2db10 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
2db20 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2db30 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
2db40 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
2db50 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
2db60 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
2db70 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
2db80 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
2db90 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
2dba0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2dbb0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
2dbc0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
2dbd0 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
2dbe0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
2dbf0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
2dc00 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
2dc10 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2dc20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
2dc30 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
2dc40 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
2dc50 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
2dc60 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
2dc70 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
2dc80 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
2dc90 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
2dca0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
2dcb0 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
2dcc0 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
2dcd0 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
2dce0 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
2dcf0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
2dd00 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
2dd10 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
2dd20 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
2dd30 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
2dd40 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
2dd50 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
2dd60 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
2dd70 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
2dd80 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
2dd90 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
2dda0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
2ddb0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
2ddc0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
2ddd0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
2dde0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
2ddf0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
2de00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2de10 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
2de20 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
2de30 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
2de40 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2de50 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
2de60 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2de70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2de80 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2de90 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
2dea0 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
2deb0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
2dec0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
2ded0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
2dee0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
2def0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2df00 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
2df10 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
2df20 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
2df30 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
2df40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2df50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2df60 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
2df70 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
2df80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2df90 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
2dfa0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
2dfb0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
2dfc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2dfd0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
2dfe0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
2dff0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
2e000 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
2e010 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
2e020 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
2e030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2e040 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2e050 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
2e060 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
2e070 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
2e080 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
2e090 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
2e0a0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
2e0b0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
2e0c0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
2e0d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
2e0e0 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
2e0f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2e100 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
2e110 70 50 61 67 65 72 29 20 26 26 20 72 63 3d 3d 53  pPager) && rc==S
2e120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e130 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
2e140 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
2e150 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
2e160 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
2e170 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
2e180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e190 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
2e1a0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2e1b0 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
2e1c0 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
2e1d0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
2e1e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67  TE_OK ){.    pag
2e1f0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
2e200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e210 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2e220 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
2e230 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2e240 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2e250 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72  _READER;.  }.  r
2e260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e270 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
2e280 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
2e290 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
2e2a0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
2e2b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
2e2c0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
2e2d0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
2e2e0 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
2e2f0 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
2e300 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
2e310 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
2e320 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2e330 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
2e340 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
2e350 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
2e360 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
2e370 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
2e380 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
2e390 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
2e3a0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
2e3b0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2e3c0 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
2e3d0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2e3e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e3f0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ==0) ){.    page
2e400 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
2e410 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
2e420 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
2e430 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2e440 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
2e450 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
2e460 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
2e470 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
2e480 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
2e490 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
2e4a0 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
2e4b0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
2e4c0 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
2e4d0 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
2e4e0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2e4f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
2e500 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
2e510 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2e520 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
2e530 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
2e540 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
2e550 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
2e560 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
2e570 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
2e580 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
2e590 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2e5a0 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
2e5b0 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
2e5c0 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
2e5d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
2e5e0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
2e5f0 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
2e600 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
2e610 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
2e620 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2e630 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
2e640 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
2e650 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
2e660 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
2e670 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
2e680 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
2e690 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
2e6a0 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
2e6b0 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
2e6c0 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
2e6d0 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
2e6e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2e6f0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
2e700 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
2e710 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
2e720 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
2e730 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
2e740 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
2e750 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2e760 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
2e770 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
2e780 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
2e790 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
2e7a0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
2e7b0 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
2e7c0 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
2e7d0 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
2e7e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2e7f0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
2e800 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
2e810 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
2e820 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
2e830 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
2e840 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
2e850 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
2e860 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
2e870 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
2e880 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
2e890 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
2e8a0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
2e8b0 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
2e8c0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
2e8d0 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
2e8e0 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63   two seperate sc
2e8f0 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
2e900 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
2e910 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
2e920 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
2e930 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
2e940 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
2e950 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
2e960 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
2e970 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
2e980 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
2e990 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
2e9a0 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
2e9b0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
2e9c0 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
2e9d0 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
2e9e0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
2e9f0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
2ea00 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
2ea10 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
2ea20 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
2ea30 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
2ea40 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2ea50 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
2ea60 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
2ea70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
2ea80 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
2ea90 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
2eaa0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
2eab0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
2eac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
2ead0 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
2eae0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
2eaf0 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
2eb00 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
2eb10 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
2eb20 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
2eb30 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
2eb40 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
2eb50 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
2eb60 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
2eb70 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
2eb80 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
2eb90 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
2eba0 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
2ebb0 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
2ebc0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
2ebd0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
2ebe0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
2ebf0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
2ec00 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
2ec10 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
2ec20 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2ec30 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
2ec40 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
2ec50 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
2ec60 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
2ec70 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
2ec80 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
2ec90 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
2eca0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
2ecb0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
2ecc0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
2ecd0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
2ece0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
2ecf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
2ed00 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
2ed10 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
2ed20 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
2ed30 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
2ed40 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
2ed50 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
2ed60 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
2ed70 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
2ed80 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
2ed90 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
2eda0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
2edb0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
2edc0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
2edd0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
2ede0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
2edf0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
2ee00 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
2ee10 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
2ee20 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
2ee30 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
2ee40 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
2ee50 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
2ee60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ee70 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
2ee80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2ee90 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
2eea0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
2eeb0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
2eec0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
2eed0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
2eee0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
2eef0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
2ef00 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
2ef10 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
2ef20 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
2ef30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
2ef40 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
2ef50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2ef60 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
2ef70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
2ef80 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2ef90 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
2efa0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
2efb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2efc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2efd0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
2efe0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
2eff0 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
2f000 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
2f010 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
2f020 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
2f030 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
2f040 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
2f050 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
2f060 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
2f070 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
2f080 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2f090 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
2f0a0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2f0b0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
2f0c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2f0d0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
2f0e0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
2f0f0 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  , ppPage);.  }..
2f100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f110 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
2f120 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
2f130 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2f140 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
2f150 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
2f160 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
2f170 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
2f180 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
2f190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
2f1a0 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
2f1b0 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
2f1c0 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
2f1d0 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
2f1e0 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
2f1f0 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
2f200 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
2f210 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
2f220 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
2f230 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
2f240 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
2f250 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70  ==pPager || (*pp
2f260 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30  Page)->pPager==0
2f270 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50   );..  if( (*ppP
2f280 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20  age)->pPager && 
2f290 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
2f2a0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
2f2b0 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
2f2c0 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
2f2d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
2f2e0 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
2f2f0 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
2f300 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
2f310 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2f320 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
2f330 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
2f340 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2f350 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47  ager) );.    PAG
2f360 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
2f370 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72  nHit);.    retur
2f380 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
2f390 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2f3a0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
2f3b0 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
2f3c0 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
2f3d0 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
2f3e0 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
2f3f0 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 50 41 47 45  d.  */..    PAGE
2f400 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
2f410 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d  Miss);.    pPg =
2f420 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50   *ppPage;.    pP
2f430 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
2f440 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
2f450 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
2f460 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
2f470 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2f480 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
2f490 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
2f4a0 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
2f4b0 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
2f4c0 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
2f4d0 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
2f4e0 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
2f4f0 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
2f500 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2f510 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
2f520 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2f530 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
2f540 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
2f550 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
2f560 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
2f570 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
2f580 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  nt)pgno || noCon
2f590 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
2f5a0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
2f5b0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
2f5c0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
2f5d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2f5e0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
2f5f0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
2f600 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
2f610 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
2f620 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
2f630 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
2f640 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
2f650 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
2f660 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
2f670 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
2f680 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
2f690 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
2f6a0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
2f6b0 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
2f6c0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
2f6d0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
2f6e0 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
2f6f0 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
2f700 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
2f710 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
2f720 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
2f730 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
2f740 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2f750 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
2f760 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
2f770 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
2f780 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2f790 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
2f7a0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2f7b0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
2f7c0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
2f7d0 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
2f7e0 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
2f7f0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
2f800 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2f810 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
2f820 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
2f830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
2f840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f850 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
2f860 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
2f870 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2f880 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
2f890 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
2f8a0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
2f8b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
2f8c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2f8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
2f8e0 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
2f8f0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
2f900 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
2f910 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
2f920 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
2f930 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
2f940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2f950 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2f960 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r );.      rc = 
2f970 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
2f980 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2f990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f9a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
2f9b0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
2f9c0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
2f9d0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
2f9e0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
2f9f0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
2fa00 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
2fa10 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
2fa20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
2fa30 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
2fa40 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2fa50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
2fa60 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
2fa70 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
2fa80 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
2fa90 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
2faa0 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
2fab0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
2fac0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
2fad0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
2fae0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
2faf0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
2fb00 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
2fb10 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
2fb20 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
2fb30 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2fb40 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
2fb50 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2fb60 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
2fb70 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
2fb80 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
2fb90 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
2fba0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
2fbb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2fbc0 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
2fbd0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
2fbe0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
2fbf0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
2fc00 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
2fc10 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
2fc20 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
2fc30 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
2fc40 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
2fc50 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
2fc60 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
2fc70 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
2fc80 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
2fc90 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
2fca0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
2fcb0 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
2fcc0 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
2fcd0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
2fce0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
2fcf0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
2fd00 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
2fd10 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
2fd20 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
2fd30 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
2fd40 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
2fd50 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
2fd60 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
2fd70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
2fd80 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
2fd90 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
2fda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2fdb0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
2fdc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2fdd0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
2fde0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
2fdf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
2fe00 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
2fe10 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
2fe20 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
2fe30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
2fe40 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
2fe50 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
2fe60 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2fe70 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2fe80 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
2fe90 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
2fea0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
2feb0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
2fec0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
2fed0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
2fee0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
2fef0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
2ff00 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
2ff10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2ff20 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
2ff30 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
2ff40 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
2ff50 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
2ff60 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
2ff70 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2ff80 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
2ff90 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
2ffa0 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
2ffb0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
2ffc0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ffd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ffe0 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
2fff0 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
30000 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
30010 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
30020 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
30030 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
30040 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
30050 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
30060 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
30070 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
30080 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
30090 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
300a0 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
300b0 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
300c0 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
300d0 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
300e0 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
300f0 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
30100 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
30110 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
30120 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
30130 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
30140 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
30150 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
30160 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
30170 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
30180 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
30190 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
301a0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
301b0 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
301c0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
301d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
301e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
301f0 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
30200 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
30210 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
30220 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
30230 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
30240 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
30250 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
30260 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
30270 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
30280 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
30290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
302a0 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
302b0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
302c0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
302d0 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
302e0 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
302f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
30300 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
30310 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
30320 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
30330 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
30340 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
30350 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
30360 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
30370 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
30380 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
30390 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
303a0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
303b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
303c0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
303d0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
303e0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
303f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
30400 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30420 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30430 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
30440 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
30450 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
30460 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
30470 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
30480 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
30490 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
304a0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
304b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
304c0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
304d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
304e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
304f0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
30500 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
30510 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
30520 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
30530 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
30540 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
30550 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
30560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
30570 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
30580 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
30590 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
305a0 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
305b0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
305c0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
305d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
305e0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
305f0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
30600 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30610 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
30620 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
30630 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
30640 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
30650 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
30660 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
30670 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
30680 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
30690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
306a0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  MEM;.    }.  .  
306b0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
306c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
306d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
306e0 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
306f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
30700 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
30710 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
30720 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
30730 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
30740 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30750 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
30760 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
30770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30780 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
30790 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
307a0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
307b0 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
307c0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
307d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
307e0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
307f0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
30800 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61  |.          (pPa
30810 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20  ger->tempFile ? 
30820 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
30830 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
30840 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
30850 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
30860 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ):.            (
30870 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30880 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20  _JOURNAL).      
30890 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65 66 20      );.  #ifdef 
308a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
308b0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
308c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
308d0 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
308e0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
308f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30900 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
30910 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
30920 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
30930 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20     );.  #else.  
30940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30950 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
30960 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30970 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
30980 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ags, 0);.  #endi
30990 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
309a0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
309b0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
309c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
309d0 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20      }.  .  .    
309e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
309f0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
30a00 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
30a10 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
30a20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
30a30 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
30a40 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
30a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30a60 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  K ){.      /* TO
30a70 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
30a80 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
30a90 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
30aa0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
30ab0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
30ac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
30ad0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
30ae0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
30af0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
30b00 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
30b10 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  0;.      rc = wr
30b20 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
30b30 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
30b40 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
30b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
30b60 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
30b70 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
30b80 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
30b90 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
30ba0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
30bb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30bc0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
30bd0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
30be0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
30bf0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
30c00 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a  _CACHEMOD;.  }..
30c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30c20 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
30c30 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
30c40 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
30c50 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
30c60 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
30c70 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
30c80 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
30c90 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
30ca0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
30cb0 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
30cc0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
30cd0 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
30ce0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
30cf0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
30d00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30d10 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
30d20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
30d30 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
30d40 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
30d50 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
30d60 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
30d70 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
30d80 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
30d90 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
30da0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
30db0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
30dc0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
30dd0 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
30de0 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
30df0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30e00 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
30e10 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
30e20 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
30e30 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
30e40 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
30e50 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
30e60 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
30e70 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
30e80 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
30e90 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
30ea0 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
30eb0 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
30ec0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
30ed0 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
30ee0 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
30ef0 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
30f00 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
30f10 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
30f20 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
30f30 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
30f40 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
30f50 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
30f60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
30f70 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
30f80 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
30f90 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
30fa0 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
30fb0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
30fc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30fd0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
30fe0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
30ff0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
31000 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
31010 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
31020 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
31030 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31040 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
31050 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
31060 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
31070 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
31080 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
31090 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
310a0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
310b0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
310c0 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
310d0 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
310e0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
310f0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
31100 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
31110 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
31120 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
31130 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
31140 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31150 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
31160 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
31170 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
31180 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
31190 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
311a0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
311b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
311c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
311d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
311e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
311f0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
31200 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
31210 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
31220 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
31230 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
31240 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
31250 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
31260 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
31270 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
31280 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
31290 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
312a0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
312b0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
312c0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
312d0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
312e0 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
312f0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
31300 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
31310 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
31320 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
31330 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
31340 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
31350 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l it..      */. 
31360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31370 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
31380 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
31390 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  ->pWal);.    }el
313a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  se{.      /* Obt
313b0 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
313c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
313d0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
313e0 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
313f0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72  r.      ** is tr
31400 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
31410 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
31420 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
31430 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
31440 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
31450 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
31460 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
31470 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
31480 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20  LUSIVE.      ** 
31490 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
314a0 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
314b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
314c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
314d0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
314e0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
314f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
31500 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31510 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  && exFlag ){.   
31520 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31530 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
31540 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
31550 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
31560 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
31570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31580 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
31590 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
315a0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
315b0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
315c0 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
315d0 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
315e0 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
315f0 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
31600 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
31610 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
31620 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
31630 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
31640 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
31650 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
31660 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
31670 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
31680 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
31690 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
316a0 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
316b0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
316c0 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
316d0 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
316e0 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
316f0 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
31700 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
31710 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
31720 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
31730 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
31740 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
31750 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
31760 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70  _LOCKED;.      p
31770 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
31780 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
31790 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
317a0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
317b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
317c0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
317d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
317e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
317f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31800 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
31810 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31820 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
31830 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
31840 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
31850 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
31860 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
31870 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
31880 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
31890 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
318a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
318b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
318c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
318d0 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
318e0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
318f0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
31900 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
31910 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
31920 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
31930 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
31940 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
31950 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
31960 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
31970 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
31980 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
31990 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
319a0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
319b0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
319c0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
319d0 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
319e0 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
319f0 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
31a00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31a10 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
31a20 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
31a30 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
31a40 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
31a50 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
31a60 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
31a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
31a80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
31a90 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
31aa0 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
31ab0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
31ac0 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
31ad0 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
31ae0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
31af0 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
31b00 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
31b10 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
31b20 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
31b30 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
31b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31b50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
31b60 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
31b70 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
31b80 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
31b90 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
31ba0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
31bb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
31bc0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
31bd0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
31be0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
31bf0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
31c00 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
31c10 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
31c20 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
31c30 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
31c40 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68  * again. This sh
31c50 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c  ould not happen,
31c60 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70   but the check p
31c70 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65  rovides robustne
31c80 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ss. */.  if( NEV
31c90 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
31ca0 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
31cb0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
31cc0 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
31cd0 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
31ce0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
31cf0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
31d00 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
31d10 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
31d20 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
31d30 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
31d40 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
31d50 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
31d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
31d70 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  ERM;..  CHECK_PA
31d80 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d  GE(pPg);..  /* M
31d90 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
31da0 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
31db0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
31dc0 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
31dd0 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
31de0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
31df0 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
31e00 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
31e10 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
31e20 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
31e30 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
31e40 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
31e50 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73  e(pPg) ){.    as
31e60 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
31e70 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
31e80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31e90 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
31ea0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
31eb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  );.  }else{..   
31ec0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
31ed0 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
31ee0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
31ef0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
31f00 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
31f10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
31f20 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 68 65 63  rnal or the chec
31f30 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
31f40 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
31f50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67     **.    ** Hig
31f60 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
31f70 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
31f80 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63  obtained the nec
31f90 65 73 73 61 72 79 20 6c 6f 63 6b 73 0a 20 20 20  essary locks.   
31fa0 20 2a 2a 20 74 6f 20 62 65 67 69 6e 20 74 68 65   ** to begin the
31fb0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
31fc0 6f 6e 2c 20 62 75 74 20 74 68 65 20 72 6f 6c 6c  on, but the roll
31fd0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  back journal mig
31fe0 68 74 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 79  ht not .    ** y
31ff0 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
32000 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
32010 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
32020 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
32030 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32040 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
32050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
32060 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
32070 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
32080 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32090 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
320a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
320b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
320c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
320d0 43 48 45 4d 4f 44 20 29 3b 0a 20 20 20 20 61 73  CHEMOD );.    as
320e0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
320f0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
32100 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   );.  .    /* Th
32110 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
32120 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
32130 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
32140 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
32150 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
32160 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
32170 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
32180 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
32190 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
321a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
321b0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
321c0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
321d0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
321e0 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
321f0 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65  al(pPg) && !page
32200 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32210 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
32220 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32230 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ger)==0 );.     
32240 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
32250 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
32260 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  ze && isOpen(pPa
32270 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
32280 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
32290 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
322a0 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
322b0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
322c0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
322d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
322e0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
322f0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
32300 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
32310 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
32320 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
32330 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
32340 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
32350 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
32360 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
32370 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
32380 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
32390 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
323a0 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
323b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
323c0 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
323d0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
323e0 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
323f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
32400 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
32410 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
32420 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
32430 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
32440 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
32450 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
32460 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
32470 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  lOff, pPg->pgno)
32480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
324a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
324b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
324c0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
324d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
324e0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
324f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32500 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32510 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
32520 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
32530 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
32540 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
32550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32560 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32580 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
32590 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
325a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
325b0 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
325c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
325d0 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
325e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
325f0 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
32600 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
32610 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
32620 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
32630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
32640 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
32650 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
32660 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
32670 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
32680 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
32690 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
326a0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
326b0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
326c0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
326d0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
326e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
326f0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
32700 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
32710 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
32720 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
32730 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
32740 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
32750 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
32760 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
32770 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75  curred while jou
32780 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
32790 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
327a0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
327b0 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
327c0 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
327d0 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
327e0 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
327f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32800 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
32810 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
32820 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
32830 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
32840 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
32850 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
32860 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
32870 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
32880 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
32890 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
328a0 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
328b0 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
328c0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
328d0 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
328e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
328f0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
32900 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
32910 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
32920 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
32930 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
32940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
32950 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  e .        ** tr
32960 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
32970 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
32980 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
32990 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
329a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
329b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
329c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
329d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
329e0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
329f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32a00 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
32a10 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
32a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
32a30 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
32a40 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
32a50 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
32a60 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
32a70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
32a80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
32a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
32aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
32ab0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
32ac0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
32ad0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
32ae0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
32af0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32b10 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
32b20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
32b30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
32b40 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
32b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32b60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
32b70 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
32b80 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
32b90 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
32ba0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
32bb0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
32bc0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
32bd0 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
32be0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
32bf0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
32c00 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
32c10 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
32c20 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
32c30 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
32c40 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
32c50 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
32c60 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
32c70 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
32c80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
32c90 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
32ca0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
32cb0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
32cc0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
32cd0 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
32ce0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
32cf0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
32d00 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
32d10 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
32d20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
32d30 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
32d40 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
32d50 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
32d60 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
32d70 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
32d80 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
32d90 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
32da0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
32db0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
32dc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
32dd0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
32de0 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
32df0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
32e00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
32e10 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
32e20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
32e30 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
32e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32e50 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
32e60 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
32e70 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  le. This routine
32e80 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
32e90 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e  before .** makin
32ea0 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  g changes to a p
32eb0 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  age. The caller 
32ec0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
32ed0 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20  eturn value .** 
32ee0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
32ef0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
32f00 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e  not to change an
32f10 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65  y page data unle
32f20 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ss .** this rout
32f30 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
32f40 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
32f50 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
32f60 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
32f70 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
32f80 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
32f90 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
32fa0 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
32fb0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
32fc0 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
32fd0 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
32fe0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
32ff0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
33000 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
33010 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
33020 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
33030 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
33040 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
33050 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
33060 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
33070 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
33080 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
33090 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
330a0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
330b0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
330c0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
330d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
330e0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
330f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33100 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
33110 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
33120 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
33130 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
33140 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
33150 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
33160 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
33170 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
33180 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33190 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
331a0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
331b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
331c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
331d0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
331e0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
331f0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
33200 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65  ;..  if( nPagePe
33210 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
33220 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
33230 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
33240 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
33250 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
33260 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
33270 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
33280 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
33290 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
332a0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
332b0 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
332c0 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20  nPage = 0;      
332d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
332e0 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
332f0 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
33300 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
33310 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
33320 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33330 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
33340 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20  needSync = 0;   
33350 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
33360 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47   any page has PG
33370 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f  HDR_NEED_SYNC */
33380 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
33390 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
333a0 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20  flag to 1. This 
333b0 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
333c0 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a  nnot allow.    *
333d0 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  * a journal head
333e0 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
333f0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
33400 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a  es journaled by.
33410 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63      ** this func
33420 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
33430 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
33440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
33450 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
33460 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  Spill==0 );.    
33470 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
33480 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f  cSpill++;..    /
33490 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
334a0 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
334b0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
334c0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
334d0 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
334e0 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
334f0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
33500 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
33510 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
33520 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
33530 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
33540 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
33550 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
33560 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
33570 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
33580 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
33590 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50   nPageCount = pP
335a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
335b0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
335c0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
335d0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
335e0 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
335f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
33600 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
33610 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
33620 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
33630 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
33640 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
33650 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
33660 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
33670 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
33680 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
33690 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
336a0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
336b0 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
336c0 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
336d0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
336e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
336f0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
33700 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
33710 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
33720 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
33730 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
33740 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
33750 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
33760 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
33770 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
33780 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
33790 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
337a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
337b0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
337c0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
337d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
337e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
337f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
33800 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
33810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
33820 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
33830 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
33840 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
33850 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
33860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33870 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33880 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
33890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
338a0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
338b0 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
338c0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
338d0 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
338e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
338f0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
33900 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
33910 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
33920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33930 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
33940 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
33950 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33960 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
33970 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
33980 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
33990 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
339a0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
339b0 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
339c0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
339d0 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
339e0 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
339f0 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
33a00 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
33a10 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
33a20 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
33a30 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
33a40 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
33a50 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
33a60 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
33a70 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
33a80 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
33a90 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
33aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33ab0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
33ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33ad0 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
33ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
33af0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
33b00 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  noSync==0 );.   
33b10 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
33b20 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  nPage; ii++){.  
33b30 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
33b40 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
33b50 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
33b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33b70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
33b80 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
33b90 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
33ba0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
33bb0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
33bc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
33bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33be0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33bf0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
33c00 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  ll==1 );.    pPa
33c10 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
33c20 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ill--;.  }else{.
33c30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
33c40 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
33c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33c60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33c70 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
33c80 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
33c90 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
33ca0 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
33cb0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
33cc0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
33cd0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
33ce0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
33cf0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
33d00 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
33d10 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
33d20 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
33d30 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33d40 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
33d50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
33d60 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
33d70 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
33d80 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
33d90 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
33da0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
33db0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
33dc0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
33dd0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
33de0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
33df0 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
33e00 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
33e10 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
33e20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
33e30 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
33e40 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
33e50 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
33e60 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
33e70 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
33e80 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
33e90 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
33ea0 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
33eb0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
33ec0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
33ed0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
33ee0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
33ef0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
33f00 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
33f10 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
33f20 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
33f30 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
33f40 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
33f50 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
33f60 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
33f70 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
33f80 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
33f90 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
33fa0 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
33fb0 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
33fc0 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
33fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
33fe0 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
33ff0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
34000 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
34010 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
34020 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
34030 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
34040 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
34050 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
34060 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
34070 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
34080 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
34090 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
340a0 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
340b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
340c0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
340d0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
340e0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
340f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
34100 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
34110 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
34120 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
34130 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
34140 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
34150 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
34160 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
34170 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
34180 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
34190 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
341a0 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
341b0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
341c0 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
341d0 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
341e0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
341f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
34200 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
34210 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
34220 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
34230 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
34240 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34250 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
34260 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
34270 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34280 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
34290 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
342a0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
342b0 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
342c0 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
342d0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
342e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
342f0 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
34300 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
34310 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
34320 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
34330 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
34340 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
34350 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
34360 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
34370 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
34380 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
34390 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
343a0 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
343b0 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
343c0 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
343d0 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
343e0 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
343f0 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
34400 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
34410 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
34420 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
34430 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
34440 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
34450 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
34460 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
34470 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
34480 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
34490 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
344a0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
344b0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
344c0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
344d0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
344e0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
344f0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
34500 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  );..  /* Declare
34510 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
34520 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
34530 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
34540 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
34550 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
34560 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
34570 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
34580 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
34590 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
345a0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
345b0 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
345c0 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
345d0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
345e0 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
345f0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
34600 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
34610 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
34620 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
34630 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
34640 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
34650 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
34660 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
34670 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
34680 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
34690 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
346a0 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
346b0 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
346c0 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
346d0 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
346e0 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
346f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
34700 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
34710 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
34720 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
34730 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
34740 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
34750 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
34760 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
34770 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
34780 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
34790 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  ode.#endif..  if
347a0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
347b0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
347c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
347d0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
347e0 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
347f0 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
34800 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
34810 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
34820 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
34830 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
34840 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   of change-count
34850 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20  er field */..   
34860 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
34870 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
34880 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
34890 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
348a0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
348b0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
348c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
348d0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
348e0 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
348f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
34900 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
34910 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
34920 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
34930 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
34940 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
34950 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
34960 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
34970 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
34980 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
34990 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
349a0 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
349b0 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
349c0 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
349d0 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
349e0 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
349f0 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
34a00 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
34a10 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
34a20 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
34a30 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
34a40 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
34a50 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
34a60 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
34a70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
34a80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34a90 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
34aa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
34ac0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
34ad0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
34ae0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
34af0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
34b00 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
34b10 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
34b20 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
34b30 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
34b40 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
34b50 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
34b60 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
34b70 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
34b80 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
34b90 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
34ba0 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
34bb0 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
34bc0 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
34bd0 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20  ..99 and in.    
34be0 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
34bf0 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
34c00 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
34c10 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
34c20 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
34c30 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
34c40 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
34c50 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
34c60 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
34c70 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20  counter);.      
34c80 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
34c90 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
34ca0 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
34cb0 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
34cc0 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
34cd0 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
34ce0 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
34cf0 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
34d00 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
34d10 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
34d20 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
34d30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
34d40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
34d50 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
34d60 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
34d70 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
34d80 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
34d90 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
34da0 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
34db0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34dd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34de0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
34df0 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
34e00 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
34e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34e20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34e40 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
34e50 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
34e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
34e80 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
34e90 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
34ea0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
34eb0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
34ec0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
34ed0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34ee0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
34ef0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
34f00 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
34f10 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20  e pager file to 
34f20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
34f30 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
34f40 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20  ory files.** or 
34f50 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
34f60 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
34f70 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
34f80 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61  uccessful, or ca
34f90 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20  lled on a pager 
34fa0 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20  for which it is 
34fb0 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a  a no-op, this.**
34fc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
34fd0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  s SQLITE_OK. Oth
34fe0 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72  erwise, an IO er
34ff0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
35000 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
35010 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61  ite3PagerSync(Pa
35020 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35030 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
35040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35050 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
35060 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
35070 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
35080 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
35090 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
350a0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
350b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
350c0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
350d0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
350e0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
350f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35100 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35110 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
35120 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74 65  ed while a write
35130 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
35140 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c  active in.** rol
35150 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f  lback. If the co
35160 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57  nnection is in W
35170 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  AL mode, this ca
35180 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a  ll is a no-op. .
35190 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
351a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
351b0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
351c0 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49   have an EXCLUSI
351d0 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  VE lock on .** t
351e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
351f0 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  , an attempt is 
35200 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f  made to obtain o
35210 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
35220 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
35230 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
35240 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  or the attempt t
35250 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a  o obtain it is.*
35260 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  * successful, or
35270 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
35280 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  is in WAL mode, 
35290 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
352a0 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  urned..** Otherw
352b0 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49  ise, either SQLI
352c0 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51  TE_BUSY or an SQ
352d0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
352e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
352f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
35300 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  t sqlite3PagerEx
35310 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65  clusiveLock(Page
35320 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
35330 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35350 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35360 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
35370 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  D .       || pPa
35380 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35390 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
353a0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
353b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
353c0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a  _WRITER_LOCKED .
353d0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
353e0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
353f0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69  e(pPager) );.  i
35400 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61  f( 0==pagerUseWa
35410 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
35420 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
35430 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
35440 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
35450 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
35460 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
35470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35480 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
35490 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
354a0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
354b0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
354c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
354d0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
354e0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
354f0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
35500 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
35510 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
35520 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
35530 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
35540 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
35550 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
35560 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
35570 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35580 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
35590 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
355a0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
355b0 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
355c0 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
355d0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
355e0 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
355f0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
35600 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
35610 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
35620 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
35630 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
35640 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
35650 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
35660 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
35670 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
35680 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
35690 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
356a0 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
356b0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
356c0 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
356d0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
356e0 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
356f0 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
35700 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
35710 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
35720 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
35730 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
35740 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
35750 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
35760 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
35770 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
35780 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
35790 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
357a0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
357b0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
357c0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
357d0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
357e0 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
357f0 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
35800 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
35810 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
35820 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35830 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
35840 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
35850 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
35860 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
35870 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
35880 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
35890 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
358a0 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
358b0 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
358c0 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
358d0 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
358e0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
358f0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
35900 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
35910 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
35920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
35930 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
35940 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
35950 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
35960 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
35970 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
35980 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
35990 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
359a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
359b0 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
359c0 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
359d0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
359e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
359f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35a00 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
35a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35a20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35a30 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
35a40 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
35a50 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35a60 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
35a70 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
35a80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35a90 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20  ITER_DBMOD.     
35aa0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
35ab0 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
35ac0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
35ad0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
35ae0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
35af0 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65   /* If a prior e
35b00 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72  rror occurred, r
35b10 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72  eport that error
35b20 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28   again. */.  if(
35b30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
35b40 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
35b50 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
35b60 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
35b70 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
35b80 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
35b90 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
35ba0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
35bb0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
35bc0 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
35bd0 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62    /* If no datab
35be0 61 73 65 20 63 68 61 6e 67 65 73 20 68 61 76 65  ase changes have
35bf0 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75   been made, retu
35c00 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
35c10 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
35c20 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e<PAGER_WRITER_C
35c30 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e  ACHEMOD ) return
35c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
35c50 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
35c60 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
35c70 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
35c80 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
35c90 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
35ca0 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   or this.    ** 
35cb0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
35cc0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
35cd0 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61  , it is mostly a
35ce0 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72   no-op.  However
35cf0 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63  , any.    ** bac
35d00 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20  kup in progress 
35d10 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
35d20 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  arted..    */.  
35d30 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
35d40 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
35d50 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65  Backup);.  }else
35d60 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  {.    if( pagerU
35d70 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
35d80 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c  .      PgHdr *pL
35d90 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
35da0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
35db0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
35dc0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29       if( pList )
35dd0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
35de0 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
35df0 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61  ager, pList, pPa
35e00 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20  ger->dbSize, 1, 
35e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
35e20 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f  ager->fullSync ?
35e30 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
35e40 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20  ags : 0).       
35e50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
35e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
35e80 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
35e90 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
35ea0 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ache);.      }. 
35eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35ec0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
35ed0 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
35ee0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
35ef0 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
35f00 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20  t.      ** does 
35f10 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20  this depends on 
35f20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
35f30 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
35f40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
35f50 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c      ** was enabl
35f60 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
35f70 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20  me, and if this 
35f80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74  transaction meet
35f90 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
35fa0 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61  runtime criteria
35fb0 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72   to use the oper
35fc0 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a  ation: .      **
35fd0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
35fe0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
35ff0 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
36000 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
36010 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20  y for.      **  
36020 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
36030 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
36040 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  d .      **    *
36050 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
36060 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
36070 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
36080 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
36090 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
360a0 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
360b0 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
360c0 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
360d0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
360e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
360f0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
36100 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20  was not enabled 
36110 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
36120 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
36130 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
36140 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75  angecounter() fu
36150 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
36160 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
36170 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63  hange.      ** c
36180 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72  ounter in 'indir
36190 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68  ect-mode'. If th
361a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
361b0 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75  s compiled in bu
361c0 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f  t.      ** is no
361d0 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20  t applicable to 
361e0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
361f0 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f  , call sqlite3Jo
36200 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20  urnalCreate().  
36210 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73      ** to make s
36220 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
36230 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c  file has actuall
36240 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  y been created, 
36250 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20  then call.      
36260 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
36270 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
36280 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
36290 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e  ge-counter in in
362a0 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  direct.      ** 
362b0 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  mode. .      **.
362c0 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
362d0 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d  se, if the optim
362e0 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20  ization is both 
362f0 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c  enabled and appl
36300 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a  icable,.      **
36310 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72   then call pager
36320 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
36330 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20  ter() to update 
36340 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
36350 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27  er.      ** in '
36360 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e  direct' mode. In
36370 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
36380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
36390 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20 20   never be.      
363a0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
363b0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
363c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64  .      */.  #ifd
363d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
363e0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
363f0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
36400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
36410 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
36420 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
36430 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36440 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
36450 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
36460 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
36470 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
36480 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36490 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
364a0 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
364b0 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  er && isOpen(pPa
364c0 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
364d0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
364e0 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
364f0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
36500 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65  .       && pPage
36510 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
36520 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20  r->dbOrigSize.  
36530 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
36540 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
36550 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
36560 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
36570 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
36580 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
36590 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
365a0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
365b0 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72  nter via the dir
365c0 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64  ect-write method
365d0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
365e0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  * following call
365f0 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65   will modify the
36600 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
36610 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67  sentation of pag
36620 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  e 1 .        ** 
36630 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
36640 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f  pdated change co
36650 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
36660 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20  rite page 1 .   
36670 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
36680 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
36690 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
366a0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
366b0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  te .        ** p
366c0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
366d0 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
366e0 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20   this is safe.. 
366f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36700 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
36710 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
36720 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
36730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
36750 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
36760 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
36770 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36790 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
367a0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
367b0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
367c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65    }.      }.  #e
367d0 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70  lse.      rc = p
367e0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
367f0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
36800 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20  0);.  #endif.   
36810 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36820 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
36830 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
36840 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  t;.  .      /* I
36850 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
36860 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
36870 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
36880 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
36890 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
368a0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
368b0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
368c0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
368d0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
368e0 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63   ** file. This c
368f0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
36900 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
36910 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  de..      **.   
36920 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
36930 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
36940 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
36950 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
36960 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65   .      ** curre
36970 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
36980 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62  r.dbSize, set db
36990 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  Size back to the
369a0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
369b0 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20  that it took at 
369c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
369d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74   transaction. Ot
369e0 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20  herwise, the.   
369f0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
36a00 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
36a10 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70   return zeroed p
36a20 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ages instead of 
36a30 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  .      ** readin
36a40 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  g data from the 
36a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
36a60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
36a70 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   When journal_mo
36a80 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f 72  de==OFF the dbOr
36a90 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79 73  igSize is always
36aa0 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20   zero, so this. 
36ab0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65       ** block ne
36ac0 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72  ver runs if jour
36ad0 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20  nal_mode=OFF..  
36ae0 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66      */.  #ifndef
36af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36b00 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
36b10 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
36b20 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  <pPager->dbOrigS
36b30 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20 70  ize .       && p
36b40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
36b50 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
36b60 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20  LMODE_OFF.      
36b70 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
36b80 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ba0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
36bb0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
36bc0 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
36bd0 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
36be0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f  _PGNO(pPager); /
36bf0 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70  * Pending lock p
36c00 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  age */.        c
36c10 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65  onst Pgno dbSize
36c20 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
36c30 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  e;       /* Data
36c40 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20  base image size 
36c50 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  */ .        pPag
36c60 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
36c70 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
36c80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
36c90 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61  dbSize+1; i<=pPa
36ca0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
36cb0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
36cc0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69    if( !sqlite3Bi
36cd0 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
36ce0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20  >pInJournal, i) 
36cf0 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
36d00 20 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72             PgHdr
36d10 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
36d20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
36d30 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20  journal */.     
36d40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36d50 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
36d60 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
36d70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
36d80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36d90 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
36da0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
36db0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36dc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36dd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
36de0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36df0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
36e00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
36e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
36e20 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
36e30 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
36e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
36e50 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
36e60 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a  bSize = dbSize;.
36e70 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e 64 69        } .  #endi
36e80 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72  f.  .      /* Wr
36e90 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
36ea0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
36eb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36ec0 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a  e. If a master .
36ed0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
36ee0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
36ef0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
36f00 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
36f10 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 20 20  al file, .      
36f20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72  ** or if zMaster
36f30 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73   is NULL (no mas
36f40 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68  ter journal), th
36f50 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
36f60 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a  a no-op..      *
36f70 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  /.      rc = wri
36f80 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
36f90 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
36fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
36fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
36fc0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
36fd0 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
36fe0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
36ff0 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 77 72  rnal file and wr
37000 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
37010 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
37020 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  ase..      ** If
37030 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
37040 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
37050 69 73 20 62 65 69 6e 67 20 75 73 65 64 2c 20 74  is being used, t
37060 68 69 73 20 73 79 6e 63 20 77 69 6c 6c 20 6e 6f  his sync will no
37070 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  t .      ** crea
37080 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
37090 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61  ile or perform a
370a0 6e 79 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20  ny real IO..    
370b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65    **.      ** Be
370c0 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65  cause the change
370d0 2d 63 6f 75 6e 74 65 72 20 70 61 67 65 20 77 61  -counter page wa
370e0 73 20 6a 75 73 74 20 6d 6f 64 69 66 69 65 64 2c  s just modified,
370f0 20 75 6e 6c 65 73 73 20 74 68 65 0a 20 20 20 20   unless the.    
37100 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 75 70 64 61    ** atomic-upda
37110 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
37120 69 73 20 75 73 65 64 20 69 74 20 69 73 20 61 6c  is used it is al
37130 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
37140 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a  t the.      ** j
37150 6f 75 72 6e 61 6c 20 72 65 71 75 69 72 65 73 20  ournal requires 
37160 61 20 73 79 6e 63 20 68 65 72 65 2e 20 48 6f 77  a sync here. How
37170 65 76 65 72 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  ever, in locking
37180 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 0a  _mode=exclusive.
37190 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 79        ** on a sy
371a0 73 74 65 6d 20 75 6e 64 65 72 20 6d 65 6d 6f 72  stem under memor
371b0 79 20 70 72 65 73 73 75 72 65 20 69 74 20 69 73  y pressure it is
371c0 20 6a 75 73 74 20 70 6f 73 73 69 62 6c 65 20 74   just possible t
371d0 68 61 74 20 74 68 69 73 20 69 73 20 0a 20 20 20  hat this is .   
371e0 20 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 63 61     ** not the ca
371f0 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  se. In this case
37200 20 69 74 20 69 73 20 6c 69 6b 65 6c 79 20 65 6e   it is likely en
37210 6f 75 67 68 20 74 68 61 74 20 74 68 65 20 72 65  ough that the re
37220 64 75 6e 64 61 6e 74 0a 20 20 20 20 20 20 2a 2a  dundant.      **
37230 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 20 77 69   xSync() call wi
37240 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
37250 20 61 20 6e 6f 2d 6f 70 20 62 79 20 74 68 65 20   a no-op by the 
37260 4f 53 20 61 6e 79 68 6f 77 2e 20 0a 20 20 20 20  OS anyhow. .    
37270 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
37280 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
37290 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  er, 0);.      if
372a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
372b0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
372c0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
372d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
372e0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
372f0 28 70 50 61 67 65 72 2c 73 71 6c 69 74 65 33 50  (pPager,sqlite3P
37300 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
37310 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
37320 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
37330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37340 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
37350 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
37360 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OCKED );.       
37370 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
37380 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
37390 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
373a0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
373b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
373c0 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
373d0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
373e0 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
373f0 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
37400 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
37410 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
37420 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
37430 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
37440 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
37450 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37460 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
37470 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
37480 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
37490 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
374a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
374b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
374c0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
374d0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
374e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
374f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37500 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
37510 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
37520 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
37530 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
37540 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37550 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
37560 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
37570 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
37580 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
37590 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
375a0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
375b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
375c0 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
375d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
375e0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
375f0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
37600 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
37610 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
37620 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
37630 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
37640 7d 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68  }.  }..commit_ph
37650 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20  ase_one_exit:.  
37660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37670 4b 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  K && !pagerUseWa
37680 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
37690 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
376a0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  = PAGER_WRITER_F
376b0 49 4e 49 53 48 45 44 3b 0a 20 20 7d 0a 20 20 72  INISHED;.  }.  r
376c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
376d0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
376e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
376f0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
37700 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
37710 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
37720 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
37730 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
37740 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
37750 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
37760 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
37770 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
37780 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
37790 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
377a0 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
377b0 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
377c0 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
377d0 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
377e0 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
377f0 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
37800 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
37810 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
37820 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
37830 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37840 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
37850 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
37860 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
37870 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
37880 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
37890 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
378a0 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
378b0 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
378c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
378d0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
378e0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
378f0 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
37900 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
37910 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
37920 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
37930 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
37940 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
37950 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
37960 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
37970 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
37980 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
37990 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
379a0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
379b0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
379c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
379d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
379e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
379f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
37a00 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
37a10 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
37a20 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
37a30 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
37a40 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
37a50 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
37a60 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
37a70 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
37a80 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
37a90 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
37aa0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
37ab0 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
37ac0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
37ad0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
37ae0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
37af0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
37b00 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
37b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37b20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37b30 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
37b40 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37b50 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37b60 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
37b70 20 20 20 20 7c 7c 20 28 70 61 67 65 72 55 73 65      || (pagerUse
37b80 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
37b90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37ba0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
37bb0 45 4d 4f 44 29 0a 20 20 29 3b 0a 20 20 61 73 73  EMOD).  );.  ass
37bc0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37bd0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37be0 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69  );..  /* An opti
37bf0 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  mization. If the
37c00 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f   database was no
37c10 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
37c20 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  ied during.  ** 
37c30 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
37c40 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  , the pager is r
37c50 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
37c60 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a  ive-mode and is.
37c70 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69    ** using persi
37c80 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  stent journals, 
37c90 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
37ca0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
37cb0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61   **.  ** The sta
37cc0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
37cd0 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
37ce0 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
37cf0 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  le journal .  **
37d00 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68 65   header with the
37d10 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74 20   nRec field set 
37d20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61 20  to 0. If such a 
37d30 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20  journal is used 
37d40 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  as.  ** a hot-jo
37d50 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74  urnal during hot
37d60 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
37d70 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c  k, 0 changes wil
37d80 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74  l be made.  ** t
37d90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
37da0 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73  ile. So there is
37db0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f   no need to zero
37dc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
37dd0 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65  ** header. Since
37de0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
37df0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
37e00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
37e10 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61  d.  ** to drop a
37e20 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e  ny locks either.
37e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37e40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37e50 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37e60 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 65  .   && pPager->e
37e70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
37e80 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
37e90 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
37ea0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
37eb0 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
37ec0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
37ed0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
37ee0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 7c  HDR_SZ(pPager) |
37ef0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
37f00 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
37f10 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
37f20 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
37f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37f40 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
37f50 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE(("COMMIT %d\
37f60 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
37f70 65 72 29 29 29 3b 0a 20 20 72 63 20 3d 20 70 61  er)));.  rc = pa
37f80 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
37f90 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
37fa0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
37fb0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
37fc0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
37fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
37fe0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
37ff0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
38000 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
38010 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
38020 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
38030 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20  on performs two 
38040 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tasks:.**.**   1
38050 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20  ) It rolls back 
38060 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
38070 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20  , restoring all 
38080 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
38090 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65  d .**      in-me
380a0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
380b0 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68   to the state th
380c0 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20  ey were in when 
380d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
380e0 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e  **      was open
380f0 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20  ed, and.**   2) 
38100 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65  It finalizes the
38110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73   journal file, s
38120 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  o that it is not
38130 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a   used for hot.**
38140 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61        rollback a
38150 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74  t any point in t
38160 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  he future..**.**
38170 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
38180 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66  following qualif
38190 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  ications:.**.** 
381a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
381b0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74   file is not yet
381c0 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
381d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
381e0 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e  ed,.**   then on
381f0 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72  ly (2) is perfor
38200 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  med. In this cas
38210 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f  e there is no jo
38220 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
38230 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a  to roll back..**
38240 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65  .** * If in an e
38250 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
38260 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
38270 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29  L, then task (1)
38280 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72   is .**   perfor
38290 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66  med. If successf
382a0 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65  ul, task (2). Re
382b0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
382c0 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20  outcome.**   of 
382d0 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f  either, the erro
382e0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
382f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
38300 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20  o the caller.** 
38310 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53    (i.e. either S
38320 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
38330 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
38340 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70  **.** * If the p
38350 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
38360 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c  _RESERVED state,
38370 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
38380 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20  ). Whether.**   
38390 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75  or not (1) is su
383a0 63 63 65 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61  ccessful, also a
383b0 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73  ttempt (2). If s
383c0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
383d0 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b  n.**   SQLITE_OK
383e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74  . Otherwise, ent
383f0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
38400 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
38410 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72  e first .**   er
38420 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74  ror code encount
38430 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  ered. .**.**   I
38440 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
38450 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
38460 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
38470 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e   was written to.
38480 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66   .**   So is saf
38490 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  e to finalize th
384a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
384b0 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62  ven if the playb
384c0 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61  ack .**   (opera
384d0 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20  tion 1) failed. 
384e0 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65  However the page
384f0 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65  r must enter the
38500 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
38510 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74    as the content
38520 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  s of the in-memo
38530 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77  ry cache are now
38540 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   suspect..**.** 
38550 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e  * Finally, if in
38560 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
38570 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74   state, then att
38580 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a  empt (1). Only.*
38590 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20  *   attempt (2) 
385a0 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73  if (1) is succes
385b0 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c  sful. Return SQL
385c0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
385d0 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72  sful,.**   other
385e0 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65  wise enter the e
385f0 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
38600 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
38610 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  code from the .*
38620 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72  *   failing oper
38630 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ation..**.**   I
38640 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
38650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
38660 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  y have been writ
38670 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68  ten to. So if th
38680 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20  e.**   playback 
38690 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f  operation did no
386a0 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75  t succeed it wou
386b0 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
386c0 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20  o finalize.**   
386d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
386e0 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65  . It needs to be
386f0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
38700 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74  e-system so that
38710 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72  .**   some other
38720 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65   process can use
38730