/ Hex Artifact Content
Login

Artifact 809f4dfbca43fd64ef27855e193d8544a5054668:


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 66 6f 6c 6c   one of the foll
14e0: 6f 77 69 6e 67 20 73 69 78 20 73 74 61 74 65 73  owing six states
14f0: 3a 0a 2a 2a 0a 2a 2a 20 20 4e 4f 4e 45 3a 0a 2a  :.**.**  NONE:.*
1500: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
1510: 72 20 73 74 61 72 74 73 20 75 70 20 69 6e 20 74  r starts up in t
1520: 68 69 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69  his state. Nothi
1530: 6e 67 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ng is guaranteed
1540: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73   in this.**    s
1550: 74 61 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20  tate - the file 
1560: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
1570: 65 20 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  e locked and the
1580: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1590: 73 0a 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e  s.**    unknown.
15a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   The database ma
15b0: 79 20 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72  y not be read or
15c0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
15d0: 20 20 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20     * No read or 
15e0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15f0: 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20  n is active..** 
1600: 20 20 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f     * Any lock, o
1610: 72 20 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c  r no lock at all
1620: 2c 20 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e  , may be held on
1630: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1640: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
1650: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
1660: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
1670: 65 20 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20  e variables may 
1680: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
1690: 2a 2a 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a  **.**  READER:.*
16a0: 2a 0a 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20  *.**    In this 
16b0: 73 74 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65  state all the re
16c0: 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72  quirements for r
16d0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
16e0: 61 73 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f  ase in .**    ro
16f0: 6c 6c 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29  llback (non-WAL)
1700: 20 6d 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55   mode are met. U
1710: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
1720: 69 73 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a  is (or recently.
1730: 2a 2a 20 20 20 20 77 61 73 29 20 69 6e 20 65 78  **    was) in ex
1740: 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
1750: 6d 6f 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76  mode, a user-lev
1760: 65 6c 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  el read transact
1770: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70  ion is .**    op
1780: 65 6e 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  en. The database
1790: 20 73 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69   size is known i
17a0: 6e 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a  n this state..**
17b0: 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72 65 61 64   .**    * A read
17c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
17d0: 20 62 65 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   be active..**  
17e0: 20 20 2a 20 41 20 53 48 41 52 45 44 20 6f 72 20    * A SHARED or 
17f0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
1800: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1810: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1820: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 20 76 61   * The dbSize va
1830: 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 74 72  riable may be tr
1840: 75 73 74 65 64 20 28 65 76 65 6e 20 69 66 20 61  usted (even if a
1850: 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64   user-level read
1860: 20 0a 2a 2a 20 20 20 20 20 20 74 72 61 6e 73 61   .**      transa
1870: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 63 74  ction is not act
1880: 69 76 65 29 2e 20 54 68 65 20 64 62 4f 72 69 67  ive). The dbOrig
1890: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
18a0: 69 7a 65 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  ize variables.**
18b0: 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 62 65        may not be
18c0: 20 74 72 75 73 74 65 64 20 61 74 20 74 68 69 73   trusted at this
18d0: 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 57   point..**.**  W
18e0: 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 3a 0a 2a  RITER_INITIAL:.*
18f0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
1900: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1910: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
1920: 20 41 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   A RESERVED or g
1930: 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68  reater lock is h
1940: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1950: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ase file..**    
1960: 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62  * The dbSize, db
1970: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
1980: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
1990: 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e  s are all valid.
19a0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e  .**    * The con
19b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
19c0: 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f  er cache have no
19d0: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  t been modified.
19e0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
19f0: 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72  rnal file may or
1a00: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
1a10: 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e  ..**    * Nothin
1a20: 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20  g (not even the 
1a30: 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68 61  first header) ha
1a40: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1a50: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1a60: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43  *.**  WRITER_CAC
1a70: 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  HEMOD:.**.**    
1a80: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
1a90: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
1aa0: 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52  .**    * A RESER
1ab0: 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
1ac0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
1ad0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ae0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
1af0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1b00: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
1b10: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1b20: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
1b30: 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65    to it, but the
1b40: 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20   header has not 
1b50: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1b60: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
1b70: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1b80: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
1b90: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a   been modified..
1ba0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42  **.**  WRITER_DB
1bb0: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  MOD:.**.**    * 
1bc0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
1bd0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
1be0: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
1bf0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
1c00: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
1c10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c20: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
1c30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1c40: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
1c50: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1c60: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
1c70: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
1c80: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
1c90: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1ca0: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
1cb0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
1cc0: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
1cd0: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
1ce0: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
1cf0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
1d00: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69  **.**    * A wri
1d10: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d20: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d30: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f  * An EXCLUSIVE o
1d40: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
1d50: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1d60: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1d70: 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e 67     * All writing
1d80: 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66 20   and syncing of 
1d90: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74 61  journal and data
1da0: 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66 69  base data has fi
1db0: 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20 20  nished..**      
1dc0: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1dd0: 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20 72 65  red, all that re
1de0: 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69 6e 61  mains is to fina
1df0: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
1e00: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f 6d 6d   to.**      comm
1e10: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1e20: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
1e30: 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65 20 63  did occur, the c
1e40: 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65 64 0a  aller will need.
1e50: 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c 6c 62  **      to rollb
1e60: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
1e70: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45 52 52  ion. .**.**  ERR
1e80: 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OR:.**.**    The
1e90: 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 73 20   ERROR state is 
1ea0: 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6e 20  entered when an 
1eb0: 49 4f 2c 20 4f 4f 4d 20 6f 72 20 64 69 73 6b 2d  IO, OOM or disk-
1ec0: 66 75 6c 6c 20 65 72 72 6f 72 20 0a 2a 2a 20 20  full error .**  
1ed0: 20 20 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f    occurs at a po
1ee0: 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
1ef0: 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 64 69  that makes it di
1f00: 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20 73 75  fficult to be su
1f10: 72 65 0a 2a 2a 20 20 20 20 74 68 61 74 20 74 68  re.**    that th
1f20: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
1f30: 72 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63  r state (cache c
1f40: 6f 6e 74 65 6e 74 73 2c 20 64 62 20 73 69 7a 65  ontents, db size
1f50: 20 65 74 63 2e 29 20 61 72 65 0a 2a 2a 20 20 20   etc.) are.**   
1f60: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
1f70: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1f80: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1f90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
1fa0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
1fb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1fc0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
1fd0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
1fe0: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
1ff0: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
2000: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
2010: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
2020: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
2030: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
2040: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
2050: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
2060: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
2070: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
2080: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
2090: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
20a0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
20b0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
20c0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
20d0: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
20e0: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
20f0: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
2100: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
2110: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
2120: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
2130: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
2140: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2150: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
2160: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
2170: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
2180: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
2190: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
21a0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
21b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
21c0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
21d0: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
21e0: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
21f0: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
2200: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
2210: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
2220: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
2230: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2240: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
2250: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
2260: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
2270: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
2280: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
2290: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
22a0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
22b0: 6e 20 62 61 63 6b 20 74 6f 20 4e 4f 4e 45 20 73  n back to NONE s
22c0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
22d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22e0: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
22f0: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
2300: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
2310: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
2320: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
2330: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
2340: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
2350: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
2360: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
2370: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
2380: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
2390: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
23a0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
23b0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
23c0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
23d0: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
23e0: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
23f0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
2400: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
2410: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
2420: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
2430: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
2440: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
2450: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
2460: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
2470: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
2480: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2490: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
24a0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
24b0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
24c0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
24d0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
24e0: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
24f0: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
2500: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
2510: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
2520: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2530: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
2540: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
2550: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
2560: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
2570: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
2580: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
2590: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
25a0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
25b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
25c0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
25d0: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
25e0: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
25f0: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
2600: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
2610: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
2620: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
2630: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
2640: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
2650: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
2660: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
2670: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
2680: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
2690: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
26a0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
26b0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
26c0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
26d0: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
26e0: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
26f0: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
2700: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
2710: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
2720: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
2730: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
2740: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
2750: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
2760: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
2770: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
2780: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
2790: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
27a0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
27b0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
27c0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
27d0: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
27e0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
27f0: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
2800: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
2810: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
2820: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
2830: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
2840: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
2850: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
2860: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
2870: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
2880: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 53 74  .**    .**.** St
2890: 61 74 65 20 64 69 61 67 72 61 6d 3a 0a 2a 2a 0a  ate diagram:.**.
28a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 4f                NO
28c0: 4e 45 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d  NE <------+-----
28d0: 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  -+.**           
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20     |         |  
2900: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20        V         
2930: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
2940: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d            +-----
2950: 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d  ----> READER----
2960: 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20  ---+      |.**  
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
2980: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
29a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
29b0: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
29e0: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54     |<-------WRIT
29f0: 45 52 5f 49 4e 49 54 49 41 4c 2d 2d 2d 2d 2d 3e  ER_INITIAL----->
2a00: 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20   ERROR.**       
2a10: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
2a20: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
2a30: 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20          ^  .**  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20              V   
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
2a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a80: 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43  |<------WRITER_C
2a90: 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e  ACHEMOD-------->
2aa0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
2ab0: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
2ac0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
2ad0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
2ae0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
2af0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20       V          
2b00: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
2b10: 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d           |<-----
2b20: 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d  --WRITER_DBMOD--
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20  -------->|.**   
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
2b50: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2ba0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2bb0: 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    +<------WRITER
2bc0: 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d  _FINISHED-------
2bd0: 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 74 61  ->+.**.**.** Sta
2be0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  te transitions a
2bf0: 6e 64 20 74 68 65 20 5b 66 75 6e 63 74 69 6f 6e  nd the [function
2c00: 5d 20 74 68 61 74 20 70 65 72 66 6f 72 6d 73 20  ] that performs 
2c10: 65 61 63 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  each:.** .**   N
2c20: 4f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ONE             
2c30: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
2c40: 20 20 20 20 20 20 20 20 5b 50 61 67 65 72 53 68          [PagerSh
2c50: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
2c60: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
2c70: 20 2d 3e 20 57 52 49 54 45 52 5f 49 4e 49 54 49   -> WRITER_INITI
2c80: 41 4c 20 20 20 20 20 20 5b 50 61 67 65 72 42 65  AL      [PagerBe
2c90: 67 69 6e 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52  gin].**   WRITER
2ca0: 5f 49 4e 49 54 49 41 4c 20 20 20 20 2d 3e 20 57  _INITIAL    -> W
2cb0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
2cc0: 20 20 20 5b 70 61 67 65 72 5f 6f 70 65 6e 5f 6a     [pager_open_j
2cd0: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
2ce0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 2d  TER_CACHEMOD   -
2cf0: 3e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  > WRITER_DBMOD  
2d00: 20 20 20 20 20 20 5b 73 79 6e 63 4a 6f 75 72 6e        [syncJourn
2d10: 61 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f  al].**   WRITER_
2d20: 44 42 4d 4f 44 20 20 20 20 20 20 2d 3e 20 57 52  DBMOD      -> WR
2d30: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 20 20  ITER_FINISHED   
2d40: 20 20 5b 50 61 67 65 72 43 6f 6d 6d 69 74 50 68    [PagerCommitPh
2d50: 61 73 65 4f 6e 65 5d 0a 2a 2a 20 0a 2a 2a 20 20  aseOne].** .**  
2d60: 20 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20   WRITER_INITIAL 
2d70: 20 20 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20     -> READER    
2d80: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
2d90: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2da0: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
2db0: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 52 45 41 44  CHEMOD   -> READ
2dc0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
2dd0: 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73  [pager_end_trans
2de0: 61 63 74 69 6f 6e 5d 0a 2a 2a 20 20 20 57 52 49  action].**   WRI
2df0: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
2e00: 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20  > READER        
2e10: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64        [pager_end
2e20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a  _transaction].**
2e30: 20 20 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48     WRITER_FINISH
2e40: 45 44 20 20 20 2d 3e 20 52 45 41 44 45 52 20 20  ED   -> READER  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
2e60: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2e70: 6f 6e 5d 0a 2a 2a 20 0a 2a 2a 20 20 20 52 45 41  on].** .**   REA
2e80: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d  DER            -
2e90: 3e 20 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 20  > NONE          
2ea0: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
2eb0: 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73  ock].**.** Notes
2ec0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
2ed0: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
2ee0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
2ef0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f00: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
2f10: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
2f20: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
2f30: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
2f40: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
2f50: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
2f60: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
2f70: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
2f80: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
2f90: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
2fa0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
2fb0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
2fc0: 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 20 20 73 74 61  _NONE.**     sta
2fd0: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
2fe0: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
2ff0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3000: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3010: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3020: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3030: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3040: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3050: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3060: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3070: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3080: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3090: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
30a0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
30b0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
30c0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
30d0: 20 50 41 47 45 52 5f 4e 4f 4e 45 20 20 20 20 20   PAGER_NONE     
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
30f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3100: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3110: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3120: 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41  ER_WRITER_INITIA
3130: 4c 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69  L        2.#defi
3140: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3150: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3160: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3170: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3180: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3190: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
31a0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 0a 0a 2f  SHED       5.../
31b0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
31c0: 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69  che as a whole i
31d0: 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20  s always in one 
31e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
31f0: 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  .** states:.**.*
3200: 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  *   PAGER_UNLOCK
3210: 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65          The page
3220: 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75   cache is not cu
3230: 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20  rrently reading 
3240: 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  or .**          
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69               wri
3260: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
3270: 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69  e file.  There i
3280: 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  s no.**         
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
32a0: 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ta held in memor
32b0: 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  y.  This is the 
32c0: 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20  initial.**      
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
32f0: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
3300: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
3310: 68 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68  he is reading th
3320: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20       Writing is 
3350: 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20  not permitted.  
3360: 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  There can be.** 
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72        multiple r
3390: 65 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67  eaders accessing
33a0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
33b0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
33d0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
33e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
33f0: 5f 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54  _RESERVED      T
3400: 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20  his process has 
3410: 72 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74  reserved the dat
3420: 61 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e  abase for writin
3430: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
3440: 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68             but h
3450: 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  as not yet made 
3460: 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e  any changes.  On
3470: 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a  ly one process.*
3480: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3490: 20 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d          at a tim
34a0: 65 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68  e can reserve th
34b0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
34c0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
34f0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f   has not been mo
3500: 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a  dified so other.
3510: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3520: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
3530: 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  es may still be 
3540: 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64  reading the on-d
3550: 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  isk.**          
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
3570: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
3580: 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53  *   PAGER_EXCLUS
3590: 49 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65  IVE     The page
35a0: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
35b0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
35c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
35d0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
35e0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
35f0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
3600: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
3620: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
3630: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
3640: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
3670: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  iting..**.**   P
3680: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
3690: 20 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76     The pager mov
36a0: 65 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65  es to this state
36b0: 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c   from PAGER_EXCL
36c0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20  USIVE.**        
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
36e0: 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70  fter all dirty p
36f0: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
3700: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3730: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
3740: 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
3750: 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  d to.**         
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
3770: 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d  sk. All that rem
3780: 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f  ains to do is to
3790: 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20   remove or.**   
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65      truncate the
37c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
37d0: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
37e0: 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n .**           
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c              will
3800: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   be committed..*
3810: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
3820: 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20  che comes up in 
3830: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
3840: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a  he first time a.
3850: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  ** sqlite3PagerG
3860: 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65  et() occurs, the
3870: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
3880: 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ns to PAGER_SHAR
3890: 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  ED..** After all
38a0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
38b0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
38c0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65  sqlite_page_unre
38d0: 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74  f(),.** the stat
38e0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61  e transitions ba
38f0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f  ck to PAGER_UNLO
3900: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
3910: 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69  ime.** that sqli
3920: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
3930: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73  is called, the s
3940: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
3950: 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53   to.** PAGER_RES
3960: 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68  ERVED.  (Note th
3970: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
3980: 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20  rite() can only 
3990: 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20  be.** called on 
39a0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  an outstanding p
39b0: 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20  age which means 
39c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
39d0: 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47  ust.** be in PAG
39e0: 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65  ER_SHARED before
39f0: 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20   it transitions 
3a00: 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  to PAGER_RESERVE
3a10: 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53  D.).** PAGER_RES
3a20: 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74  ERVED means that
3a30: 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65   there is an ope
3a40: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
3a50: 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73  al..** The trans
3a60: 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45  ition to PAGER_E
3a70: 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20  XCLUSIVE occurs 
3a80: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
3a90: 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74  es.** are made t
3aa0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
3ab0: 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74  ile, though writ
3ac0: 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  es to the rollba
3ad0: 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63  ck.** journal oc
3ae0: 63 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50  curs with just P
3af0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20  AGER_RESERVED.  
3b00: 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33  After an sqlite3
3b10: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a  PagerRollback().
3b20: 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  ** or sqlite3Pag
3b30: 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
3b40: 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61  (), the state ca
3b50: 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47  n go back to PAG
3b60: 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72  ER_SHARED,.** or
3b70: 20 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20   it can stay at 
3b80: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
3b90: 69 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63  if we are in exc
3ba0: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
3bb0: 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  de..*/.#define P
3bc0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20  AGER_UNLOCK     
3bd0: 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   0.#define PAGER
3be0: 5f 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20  _SHARED      1  
3bf0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52   /* same as SHAR
3c00: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
3c10: 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ne PAGER_RESERVE
3c20: 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65  D    2   /* same
3c30: 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   as RESERVED_LOC
3c40: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
3c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34  ER_EXCLUSIVE   4
3c60: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58     /* same as EX
3c70: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a  CLUSIVE_LOCK */.
3c80: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59  #define PAGER_SY
3c90: 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a  NCED      5../*.
3ca0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
3cb0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
3cc0: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
3cd0: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
3ce0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
3cf0: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
3d00: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
3d10: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
3d20: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
3d30: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
3d40: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
3d50: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
3d60: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
3d70: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
3d80: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
3d90: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
3da0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
3db0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
3dc0: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
3dd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
3de0: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
3df0: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
3e00: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
3e10: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
3e20: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
3e30: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
3e40: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
3e50: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
3e60: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
3e70: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
3e80: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
3e90: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
3ea0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
3eb0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
3ec0: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
3ed0: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
3ee0: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
3ef0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
3f00: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
3f10: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
3f20: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
3f30: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
3f40: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
3f50: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
3f60: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
3f70: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
3f80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
3f90: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
3fa0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
3fb0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
3fc0: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
3fd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
3fe0: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
3ff0: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4000: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4010: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4020: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4030: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4040: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4050: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4060: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4070: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4080: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4090: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
40a0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
40b0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
40c0: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
40d0: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
40e0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
40f0: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4100: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4110: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4120: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4130: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4140: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4150: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4160: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4170: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4180: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4190: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
41a0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
41b0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
41c0: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
41d0: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
41e0: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
41f0: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
4200: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
4210: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
4220: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
4230: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
4240: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
4250: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4260: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
4270: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
4280: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
4290: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
42a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
42b0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
42c0: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
42d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
42e0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
42f0: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
4300: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4320: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
4330: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
4340: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
4350: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
4360: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
4370: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
4380: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
4390: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
43a0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
43b0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
43c0: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
43d0: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
43e0: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
43f0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
4400: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
4410: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
4420: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4430: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
4440: 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20  * errCode.**.** 
4450: 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20    Pager.errCode 
4460: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51  may be set to SQ
4470: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
4480: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a  TE_CORRUPT, or.*
4490: 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  *   or SQLITE_FU
44a0: 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20  LL. Once one of 
44b0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
44c0: 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69  errors occurs, i
44d0: 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 20 20  t persists.**   
44e0: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
44f0: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
4500: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
4510: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
4520: 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55  e.**   SQLITE_FU
4530: 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  LL return code i
4540: 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  s slightly diffe
4550: 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74  rent. It persist
4560: 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65  s only until the
4570: 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63 63 65  .**   next succe
4580: 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69  ssful rollback i
4590: 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  s performed on t
45a0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
45b0: 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c 49 54  Also,.**   SQLIT
45c0: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
45d0: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
45e0: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
45f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
4600: 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49 73 2c  kup().**   APIs,
4610: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
4620: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
4630: 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69  ully..**.** dbSi
4640: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
4650: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
4660: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
4670: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
4680: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
4690: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
46a0: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
46b0: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
46c0: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
46d0: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
46e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
46f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
4700: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
4710: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
4720: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
4730: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
4740: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
4750: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
4760: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
4770: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
4780: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
4790: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
47a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
47b0: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
47c0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
47d0: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
47e0: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
47f0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
4800: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
4810: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
4820: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
4830: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
4840: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
4850: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
4860: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
4870: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
4880: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
4890: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
48a0: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
48b0: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
48c0: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
48d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
48e0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
48f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
4900: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
4910: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
4920: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
4930: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4940: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
4950: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
4960: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
4970: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
4980: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
4990: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
49a0: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
49b0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
49c0: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
49d0: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
49e0: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
49f0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
4a00: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
4a10: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
4a20: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
4a30: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
4a40: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
4a50: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
4a60: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
4a70: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
4a80: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4a90: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
4aa0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
4ab0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
4ac0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
4ad0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
4ae0: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
4af0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
4b00: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
4b10: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
4b20: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
4b30: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
4b40: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
4b50: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
4b60: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
4b70: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
4b80: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
4b90: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
4ba0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
4bb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4bc0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
4bd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
4be0: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
4bf0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4c00: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
4c10: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
4c20: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
4c30: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
4c40: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
4c50: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
4c60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
4c70: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
4c80: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
4c90: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
4ca0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
4cb0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
4cc0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
4cd0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
4ce0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
4cf0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
4d00: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
4d10: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
4d20: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
4d30: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
4d40: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
4d50: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
4d60: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
4d70: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
4d80: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
4d90: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
4da0: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
4db0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
4dc0: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
4dd0: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
4de0: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
4df0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
4e00: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
4e10: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
4e20: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
4e30: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
4e40: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
4e50: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
4e60: 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61 20  is set during a 
4e70: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
4e80: 6e 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  n after the firs
4e90: 74 20 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 2d  t .**   journal-
4ea0: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
4eb0: 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  n and synced to 
4ec0: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 66  disk..**.**   Af
4ed0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
4ee0: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
4ef0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
4f00: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
4f10: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
4f20: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
4f30: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
4f40: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
4f50: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
4f60: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
4f70: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
4f80: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
4f90: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
4fa0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
4fb0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
4fc0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
4fd0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
4fe0: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
4ff0: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5000: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5020: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5030: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5040: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5050: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5060: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5070: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5080: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5090: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
50a0: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
50b0: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
50c0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
50d0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
50e0: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
50f0: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5100: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5110: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5120: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5130: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5140: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5150: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5160: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5170: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5180: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5190: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
51a0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
51b0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
51c0: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
51d0: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
51e0: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
51f0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5200: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5210: 2e 20 49 66 2c 0a 2a 2a 20 20 20 6f 6e 20 74 68  . If,.**   on th
5220: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 74  e other hand, it
5230: 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20   does contain a 
5240: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5250: 6f 69 6e 74 65 72 2c 20 74 68 65 0a 2a 2a 20 20  ointer, the.**  
5260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
5270: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 74 72   finalized by tr
5280: 75 6e 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a  uncating it to z
5290: 65 72 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20  ero bytes, just 
52a0: 61 73 20 69 66 0a 2a 2a 20 20 20 74 68 65 20 63  as if.**   the c
52b0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65 20 72  onnection were r
52c0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
52d0: 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
52e0: 22 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  " mode..**.**   
52f0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68  Journal files th
5300: 61 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65  at contain maste
5310: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
5320: 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e  rs cannot be fin
5330: 61 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70  alized.**   simp
5340: 6c 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e  ly by overwritin
5350: 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  g the first jour
5360: 6e 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20  nal-header with 
5370: 7a 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a  zeroes, as the.*
5380: 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  *   master journ
5390: 61 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64  al pointer could
53a0: 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20   interfere with 
53b0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
53c0: 62 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20  back of any.**  
53d0: 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e   subsequently in
53e0: 74 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61  terrupted transa
53f0: 63 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65  ction that reuse
5400: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
5410: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  le..**.**   The 
5420: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20  flag is cleared 
5430: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a  as soon as the j
5440: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
5450: 69 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72  inalized (either
5460: 0a 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f  .**   by PagerCo
5470: 6d 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20  mmitPhaseTwo or 
5480: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20  PagerRollback). 
5490: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70  If an IO error p
54a0: 72 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20  revents the.**  
54b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72   journal file fr
54c0: 6f 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73  om being success
54d0: 66 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c  fully finalized,
54e0: 20 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66   the setMaster f
54f0: 6c 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61  lag.**   is clea
5500: 72 65 64 20 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a  red anyway..**.*
5510: 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20 64 6f  * doNotSpill, do
5520: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a 2a 0a  NotSyncSpill.**.
5530: 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62 6c 65  **   When enable
5540: 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c 73 20  d, cache spills 
5550: 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20  are prohibited. 
5560: 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
5570: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 69 6e  variable.**   in
5580: 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
5590: 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e 6f 74   spill and doNot
55a0: 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69 62 69  SyncSpill inhibi
55b0: 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c 73 20  ts those spills 
55c0: 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c 64 20  that.**   would 
55d0: 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
55e0: 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64 6f 4e  l sync.  The doN
55f0: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20 73  otSyncSpill is s
5600: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 0a  et and cleared .
5610: 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65 33 50  **   by sqlite3P
5620: 61 67 65 72 57 72 69 74 65 28 29 20 69 6e 20 6f  agerWrite() in o
5630: 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
5640: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 66  a journal sync f
5650: 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 0a 2a  rom happening .*
5660: 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e 20 74  *   in between t
5670: 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f  he journalling o
5680: 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74  f two pages on t
5690: 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 20  he same sector. 
56a0: 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f 74 53   The.**   doNotS
56b0: 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74 20 74  pill value set t
56c0: 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65 72 53  o prevent pagerS
56d0: 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74 72 79  tress() from try
56e0: 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20 20 20  ing to use.**   
56f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75 72 69  the journal duri
5700: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
5710: 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72  *.** subjInMemor
5720: 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69  y.**.**   This i
5730: 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  s a boolean vari
5740: 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20 74  able. If true, t
5750: 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
5760: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
5770: 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20 61    is opened as a
5780: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
5790: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61 6c  nal file. If fal
57a0: 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f  se, then in-memo
57b0: 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72  ry.**   sub-jour
57c0: 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75 73  nals are only us
57d0: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
57e0: 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2f   pager files..*/
57f0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
5800: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5810: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs;          /*
5820: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f   OS functions to
5830: 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20   use for IO */. 
5840: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
5850: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
5860: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
5870: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
5880: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
5890: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20   journalMode;   
58a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
58b0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
58c0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
58d0: 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  es */.  u8 useJo
58e0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
58f0: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
5900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
5910: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
5920: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5940: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
5950: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
5960: 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b   */.  u8 noSync;
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
5990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
59a0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
59b0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
59c0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
59d0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
59e0: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
59f0: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
5a00: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
5a10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
5a20: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
5a30: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
5a40: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
5a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
5a60: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
5a70: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
5a80: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5aa0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
5ab0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
5ac0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ae0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
5af0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
5b00: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  /..  /* The foll
5b10: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
5b20: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
5b30: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61 72   members that ar
5b40: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
5b50: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ** modified duri
5b60: 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ng normal operat
5b70: 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20  ions. The other 
5b80: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69  variables in thi
5b90: 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  s structure.  **
5ba0: 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73   are either cons
5bb0: 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20  tant throughout 
5bc0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20  the lifetime of 
5bd0: 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c  the pager, or el
5be0: 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  se.  ** used to 
5bf0: 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74  store configurat
5c00: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74  ion parameters t
5c10: 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20 77  hat affect the w
5c20: 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20 20  ay the pager .  
5c30: 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a  ** operates..  *
5c40: 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74  *.  ** The 'stat
5c50: 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20 64  e' variable is d
5c60: 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65  escribed in more
5c70: 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69   detail along wi
5c80: 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63  th the.  ** desc
5c90: 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  riptions of the 
5ca0: 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61  values it may ta
5cb0: 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ke - PAGER_UNLOC
5cc0: 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74  K etc. Many of t
5cd0: 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61  he.  ** other va
5ce0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
5cf0: 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69  block are descri
5d00: 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  bed in the comme
5d10: 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a  nt directly .  *
5d20: 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61  * above this cla
5d30: 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20  ss definition.. 
5d40: 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b   */.  u8 eState;
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d60: 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65    /* Pager state
5d70: 20 28 4e 4f 4e 45 2c 20 52 45 41 44 45 52 2c 20   (NONE, READER, 
5d80: 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 2e 2e  WRITER_INITIAL..
5d90: 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  ) */.  u8 eLock;
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
5dc0: 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62  ck held on datab
5dd0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
5de0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
5df0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
5e00: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
5e10: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5e20: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
5e30: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5e50: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
5e60: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
5e70: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
5e80: 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20  oNotSpill;      
5e90: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
5ea0: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
5eb0: 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  e when non-zero 
5ec0: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e  */.  u8 doNotSyn
5ed0: 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20  cSpill;         
5ee0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20   /* Do not do a 
5ef0: 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71 75 69  spill that requi
5f00: 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f  res jrnl sync */
5f10: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
5f20: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
5f30: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
5f40: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
5f50: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
5f60: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
5f70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5f80: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
5f90: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
5fa0: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
5fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
5fc0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
5fd0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
5fe0: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
5ff0: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
6000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6010: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
6020: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
6030: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6050: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
6060: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
6070: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
60a0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
60b0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
60c0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
60d0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
60e0: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
60f0: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
6100: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
6110: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
6140: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
6150: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
6160: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
6170: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
6180: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
6190: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
61a0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
61b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
61c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
61d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
61e0: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
61f0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
6200: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
6210: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
6220: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
6230: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
6240: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
6250: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
6260: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
6270: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
6280: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
6290: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
62a0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
62b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
62c0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
62d0: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
62e0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
62f0: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
6300: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
6310: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
6320: 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  eLimit;       /*
6330: 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   Size limit for 
6340: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
6350: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61  al files */.  Pa
6360: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
6370: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
6380: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
6390: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
63a0: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
63b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
63c0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
63d0: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
63e0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
63f0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
6400: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
6410: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
6420: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  e changes */.  u
6430: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
6440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
6450: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
6460: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
6470: 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74  k */..  u16 nExt
6480: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
6490: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
64a0: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
64b0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
64c0: 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65  e */.  i16 nRese
64d0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
64e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
64f0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74 20  unused bytes at 
6500: 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  end of each page
6510: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
6520: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
6530: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
6540: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
6550: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  () */.  int page
6560: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
6570: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6580: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
6590: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
65a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
65b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
65c0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
65d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
65e0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
65f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6600: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
6610: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
6620: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
6630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
6640: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
6650: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
6660: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
6670: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
6680: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
6690: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
66a0: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
66b0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
66c0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
66d0: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66  syHandler */.#if
66e0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
66f0: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
6700: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
6710: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
6720: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
6730: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6750: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
6760: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
6770: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
6780: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
6790: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
67a0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
67b0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
67c0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
67d0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
67e0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
67f0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
6800: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
6810: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
6820: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
6830: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
6840: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
6850: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
6860: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
6870: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
6880: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
6890: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
68a0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
68b0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
68c0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
68d0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
68e0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
68f0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
6900: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
6910: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
6920: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
6930: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
6940: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
6950: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
6960: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
6970: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
6980: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
6990: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
69a0: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
69b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
69c0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
69d0: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
69e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
69f0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
6a00: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
6a10: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6a20: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
6a30: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
6a40: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
6a50: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
6a60: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
6a70: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
6a80: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
6a90: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
6aa0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
6ab0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
6ac0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
6ad0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
6ae0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
6af0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
6b00: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
6b10: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
6b20: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
6b30: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
6b40: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
6b50: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
6b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
6b70: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
6b80: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
6b90: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
6ba0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
6bb0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
6bc0: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
6bd0: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
6be0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
6bf0: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
6c00: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
6c10: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
6c20: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
6c30: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
6c40: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
6c50: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
6c60: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
6c70: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
6c80: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
6c90: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
6ca0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
6cb0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
6cc0: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
6cd0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
6ce0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
6cf0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
6d00: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
6d10: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
6d20: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
6d30: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
6d40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
6d50: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
6d60: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
6d70: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
6d80: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
6d90: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
6da0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
6db0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
6dc0: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
6dd0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
6de0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6df0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
6e00: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
6e10: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
6e20: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
6e30: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
6e40: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
6e50: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
6e60: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
6e70: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
6e80: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
6e90: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
6ea0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
6eb0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
6ec0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
6ed0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
6ee0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
6ef0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
6f00: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
6f10: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
6f20: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
6f30: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
6f40: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
6f50: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
6f60: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
6f70: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
6f80: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
6f90: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
6fa0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
6fb0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
6fc0: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
6fd0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
6fe0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
6ff0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
7000: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
7010: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
7020: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
7030: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
7040: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
7050: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
7060: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
7070: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
7080: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
7090: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
70a0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
70b0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
70c0: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
70d0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
70e0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
70f0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
7100: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
7110: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
7120: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
7130: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
7140: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
7150: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
7160: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
7170: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
7180: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
7190: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
71a0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
71b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
71c0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
71d0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
71e0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
71f0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
7200: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
7210: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
7220: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
7230: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
7240: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
7250: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
7260: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
7270: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
7280: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
7290: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
72a0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
72b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
72c0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
72d0: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
72e0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
72f0: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
7300: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
7310: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
7320: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
7330: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
7340: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
7350: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
7360: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
7370: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
7380: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
7390: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
73a0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
73b0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
73c0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
73d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
73e0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
73f0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
7400: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
7410: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
7420: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
7430: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
7440: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
7450: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
7460: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
7470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
7480: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
7490: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
74a0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
74b0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
74c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
74d0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
74e0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
74f0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
7500: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
7510: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
7520: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
7530: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
7540: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
7550: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
7560: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
7570: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
7580: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
7590: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
75a0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
75b0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
75c0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
75d0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
75e0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
75f0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
7600: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
7610: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
7620: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
7630: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
7640: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
7650: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
7660: 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  hods)../*.** Ret
7670: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
7680: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
7690: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
76a0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
76b0: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
76c0: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
76d0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
76e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
76f0: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
7700: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
7710: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
7720: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
7730: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
7740: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
7750: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
7760: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
7770: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
7780: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
7790: 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20 64  v,w,x,y,z) 0.# d
77a0: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
77b0: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
77c0: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
77d0: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
77e0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
77f0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
7800: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
7810: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
7820: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
7830: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
7840: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
7850: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
7860: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
7870: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
7880: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
7890: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
78a0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
78b0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
78c0: 50 41 47 45 52 5f 4e 4f 4e 45 0a 20 20 20 20 20  PAGER_NONE.     
78d0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
78e0: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
78f0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
7900: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 49  ==PAGER_WRITER_I
7910: 4e 49 54 49 41 4c 0a 20 20 20 20 20 20 20 7c 7c  NITIAL.       ||
7920: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
7930: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
7940: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
7950: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
7960: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
7970: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
7980: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
7990: 53 48 45 44 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  SHED.  );..  /* 
79a0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
79b0: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
79c0: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
79d0: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
79e0: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
79f0: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
7a00: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
7a10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
7a20: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
7a30: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
7a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
7a50: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
7a60: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
7a70: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
7a80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
7a90: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
7aa0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
7ab0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
7ac0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
7ad0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
7ae0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
7af0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
7b00: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
7b10: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
7b20: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
7b30: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
7b40: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
7b50: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
7b60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7b70: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
7b80: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
7b90: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
7ba0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
7bb0: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
7bc0: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
7bd0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
7be0: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
7bf0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
7c00: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
7c10: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
7c20: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
7c30: 6e 6f 53 79 6e 63 2e 20 2a 2f 0a 20 20 61 73 73  noSync. */.  ass
7c40: 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70  ert( !MEMDB || p
7c50: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 0a 20 20 73  ->noSync );..  s
7c60: 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65  witch( p->eState
7c70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
7c80: 45 52 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 61  ER_NONE:.      a
7c90: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
7ca0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
7cb0: 70 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  p->tempFile );. 
7cc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
7cd0: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
7ce0: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
7cf0: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
7d00: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f  ED_LOCK || p->no
7d10: 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  Readlock );.    
7d20: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
7d30: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
7d40: 49 4e 49 54 49 41 4c 3a 0a 20 20 20 20 20 20 69  INITIAL:.      i
7d50: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
7d60: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
7d70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
7d80: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
7d90: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
7da0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
7db0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
7dc0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
7dd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7de0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
7df0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
7e00: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
7e10: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
7e20: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
7e30: 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 69 66  CHEMOD:.      if
7e40: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
7e50: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
7e60: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
7e70: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
7e80: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
7e90: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
7ea0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
7eb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
7ec0: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
7ed0: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
7ee0: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
7ef0: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
7f00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
7f10: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
7f20: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
7f30: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
7f40: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
7f50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7f60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
7f70: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
7f80: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  CK );.        as
7f90: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
7fa0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
7fb0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
7fc0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
7fd0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
7fe0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
7ff0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
8000: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
8010: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
8020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
8030: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
8040: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
8050: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
8060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
8070: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
8080: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
8090: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
80a0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
80b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
80c0: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
80d0: 45 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55  E_LOCK || pagerU
80e0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
80f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
8100: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20  sOpen(p->jfd) . 
8110: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
8120: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
8130: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
8140: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
8150: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
8160: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
8170: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
8180: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
8190: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
81a0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
81b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
81c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
81d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
81e0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
81f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 7c 7c 20  CLUSIVE_LOCK || 
8200: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
8210: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  er) );.      ass
8220: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
8230: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
8240: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
8250: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
8260: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
8270: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
8280: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
8290: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
82a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72       );.      br
82b0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
82c0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 28  rn 1;.}../*.** (
82d0: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
82e0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
82f0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
8300: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
8310: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
8320: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
8330: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
8340: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
8350: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
8360: 74 2c 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  t,.      "State:
8370: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
8380: 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20       "Lock:     
8390: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
83a0: 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20   "Locking mode: 
83b0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73   locking_mode=%s
83c0: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
83d0: 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61  al mode:  journa
83e0: 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  l_mode=%s\n".   
83f0: 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72     "Backing stor
8400: 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d  e: tempFile=%d m
8410: 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e  emDb=%d useJourn
8420: 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c  al=%d\n".      ,
8430: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
8440: 52 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 20  R_NONE          
8450: 20 20 3f 20 22 4e 4f 4e 45 22 20 3a 0a 20 20 20    ? "NONE" :.   
8460: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
8470: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
8480: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
8490: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
84a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
84b0: 45 52 5f 49 4e 49 54 49 41 4c 20 20 3f 20 22 57  ER_INITIAL  ? "W
84c0: 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 22 20 3a  RITER_INITIAL" :
84d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
84e0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
84f0: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
8500: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
8510: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
8520: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
8530: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
8540: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
8550: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
8560: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
8570: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
8580: 49 4e 49 53 48 45 44 22 20 3a 20 22 3f 65 72 72  INISHED" : "?err
8590: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
85a0: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
85b0: 20 20 20 20 20 20 20 3f 20 22 4e 4f 4e 45 22 20         ? "NONE" 
85c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
85d0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
85e0: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
85f0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
8600: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
8610: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
8620: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
8630: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
8640: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
8650: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
8660: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
8670: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
8680: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
8690: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
86a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
86b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
86c0: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
86d0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
86e0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
86f0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
8700: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
8710: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
8720: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8730: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
8740: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
8750: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
8760: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8770: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
8780: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
8790: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
87a0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
87b0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
87c0: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
87d0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
87e0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
87f0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
8800: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
8810: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
8820: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
8830: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
8840: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
8850: 61 6c 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  al.  );..  retur
8860: 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
8870: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8880: 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63  rue if it is nec
8890: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
88a0: 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74  page *pPg into t
88b0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
88c0: 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20  ** A page needs 
88d0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
88e0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
88f0: 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73  al if there exis
8900: 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72  ts one.** or mor
8910: 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
8920: 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a  s for which:.**.
8930: 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d  **   * The page-
8940: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
8950: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8960: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e  PagerSavepoint.n
8970: 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  Orig, and.**   *
8980: 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   The bit corresp
8990: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  onding to the pa
89a0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  ge-number is not
89b0: 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50   set in.**     P
89c0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
89d0: 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  nSavepoint..*/.s
89e0: 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65  tatic int subjRe
89f0: 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72  quiresPage(PgHdr
8a00: 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70   *pPg){.  Pgno p
8a10: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
8a20: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
8a30: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
8a40: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
8a50: 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53  =0; i<pPager->nS
8a60: 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a  avepoint; i++){.
8a70: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
8a80: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
8a90: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a  >aSavepoint[i];.
8aa0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67      if( p->nOrig
8ab0: 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c  >=pgno && 0==sql
8ac0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
8ad0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
8ae0: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
8af0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
8b00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8b10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8b20: 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20  rue if the page 
8b30: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
8b40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
8b50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8b60: 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64  geInJournal(PgHd
8b70: 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  r *pPg){.  retur
8b80: 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  n sqlite3BitvecT
8b90: 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d  est(pPg->pPager-
8ba0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
8bb0: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
8bc0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
8bd0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
8be0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
8bf0: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
8c00: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
8c10: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
8c20: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
8c30: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
8c40: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
8c50: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
8c60: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
8c70: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
8c80: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
8c90: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
8ca0: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
8cb0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
8cc0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
8cd0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
8ce0: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
8cf0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8d00: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
8d10: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8d20: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
8d30: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
8d40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8d50: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
8d60: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
8d70: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
8d80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
8d90: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
8da0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
8db0: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
8dc0: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
8dd0: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
8de0: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
8df0: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
8e00: 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a  (u8*)A,B).../*.*
8e10: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
8e20: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
8e30: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
8e40: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
8e50: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
8e60: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
8e70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
8e80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
8e90: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
8ea0: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
8eb0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
8ec0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
8ed0: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
8ee0: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
8ef0: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
8f00: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
8f10: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
8f20: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  et);.}../*.** If
8f30: 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65   file pFd is ope
8f40: 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f  n, call sqlite3O
8f50: 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e  sUnlock() on it.
8f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
8f70: 73 55 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  sUnlock(Pager *p
8f80: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
8f90: 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  ){.  if( !isOpen
8fa0: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
8fb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8fc0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
8fd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
8fe0: 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73  k>=eLock );.  as
8ff0: 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f  sert( eLock!=NO_
9000: 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65  LOCK || pagerUse
9010: 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
9020: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  ;.  pPager->eLoc
9030: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  k = eLock;.  ret
9040: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
9050: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
9060: 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLock);.}../*.**
9070: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9080: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
9090: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
90a0: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
90b0: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
90c0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
90d0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
90e0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
90f0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
9100: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
9110: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
9120: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
9130: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
9140: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
9150: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
9160: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
9170: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
9180: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
9190: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
91a0: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
91b0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
91c0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
91d0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
91e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
91f0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
9200: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
9210: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
9220: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
9230: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
9240: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
9250: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
9260: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
9270: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
9280: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
9290: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
92a0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
92b0: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
92c0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
92d0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
92e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
92f0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
9300: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
9310: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
9320: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
9330: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
9340: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
9350: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
9360: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
9370: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9380: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9390: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
93a0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
93b0: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
93e0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
93f0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
9400: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9410: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
9420: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
9430: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
9460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
9470: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
9480: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
9490: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
94a0: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
94b0: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
94c0: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
94d0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
94e0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
94f0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
9500: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
9510: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
9520: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
9530: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
9540: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
9550: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
9560: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
9570: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
9580: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
9590: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
95a0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
95b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
95c0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
95d0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
95e0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
95f0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
9600: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
9610: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
9620: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
9630: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
9640: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
9650: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
9660: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
9670: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
9680: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
9690: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
96a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
96b0: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
96c0: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
96d0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
96e0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
96f0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
9700: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
9710: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
9720: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
9730: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
9740: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
9750: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
9760: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
9770: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
9780: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
9790: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
97a0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
97b0: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
97c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
97d0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
97e0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
97f0: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
9800: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
9810: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
9820: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
9830: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
9840: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
9850: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
9860: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
9870: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
9880: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
9890: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
98a0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
98b0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
98c0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
98d0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
98e0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
98f0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9900: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
9910: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
9920: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
9930: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
9940: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
9950: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
9960: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
9970: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
9980: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
9990: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
99a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
99b0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
99c0: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
99d0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
99e0: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c  >errCode.      |
99f0: 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  | (pPg->flags&PG
9a00: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
9a10: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
9a20: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
9a30: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
9a40: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
9a50: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
9a60: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
9a70: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
9a80: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
9a90: 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45  endif  /* SQLITE
9aa0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a  _CHECK_PAGES */.
9ab0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
9ac0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
9ad0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
9ae0: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
9af0: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
9b00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
9b10: 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d  mpts to read a m
9b20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9b30: 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  le name from the
9b40: 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20   .** end of the 
9b50: 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63  file and, if suc
9b60: 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20  cessful, copies 
9b70: 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  it into memory s
9b80: 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74  upplied .** by t
9b90: 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63  he caller. See c
9ba0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72  omments above wr
9bb0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
9bc0: 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61  () for the forma
9bd0: 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  t.** used to sto
9be0: 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  re a master jour
9bf0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74  nal file name at
9c00: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
9c10: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
9c20: 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70  * zMaster must p
9c30: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
9c40: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61   of at least nMa
9c50: 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63  ster bytes alloc
9c60: 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63  ated by.** the c
9c70: 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75  aller. This shou
9c80: 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66  ld be sqlite3_vf
9c90: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28  s.mxPathname+1 (
9ca0: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20  to ensure there 
9cb0: 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61  is.** enough spa
9cc0: 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ce to write the 
9cd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9ce0: 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73  ame). If the mas
9cf0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e  ter journal.** n
9d00: 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ame in the journ
9d10: 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61  al is longer tha
9d20: 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  n nMaster bytes 
9d30: 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20  (including a.** 
9d40: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c  nul-terminator),
9d50: 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61   then this is ha
9d60: 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d  ndled as if no m
9d70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9d80: 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  me.** were prese
9d90: 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nt in the journa
9da0: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61  l..**.** If a ma
9db0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9dc0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
9dd0: 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
9de0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
9df0: 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
9e00: 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
9e10: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
9e20: 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a  o by zMaster. A.
9e30: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
9e40: 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64  r byte is append
9e50: 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ed to the buffer
9e60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d   following the m
9e70: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
9e80: 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a   file name..**.*
9e90: 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72  * If it is deter
9ea0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61  mined that no ma
9eb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9ec0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
9ed0: 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d  t .** zMaster[0]
9ee0: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
9ef0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
9f00: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ned..**.** If an
9f10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
9f20: 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  ile reading from
9f30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9f40: 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  e, an SQLite.** 
9f50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
9f60: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9f70: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
9f80: 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f  Journal(sqlite3_
9f90: 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  file *pJrnl, cha
9fa0: 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20  r *zMaster, u32 
9fb0: 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  nMaster){.  int 
9fc0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9fd0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
9fe0: 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c   code */.  u32 l
9ff0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
a000: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
a010: 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74  in bytes of mast
a020: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a030: 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  */.  i64 szJ;   
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e  /* Total size in
a060: 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61   bytes of journa
a070: 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a  l file pJrnl */.
a080: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0a0: 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  MJ checksum valu
a0b0: 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72  e read from jour
a0c0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
a0f0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
a100: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a110: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20  aMagic[8];   /* 
a120: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
a130: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
a140: 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30  r */.  zMaster[0
a150: 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28  ] = '\0';..  if(
a160: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
a170: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
a180: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
a190: 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20  ).   || szJ<16. 
a1a0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
a1b0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
a1c0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
a1d0: 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e  &len)).   || len
a1e0: 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c  >=nMaster .   ||
a1f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
a200: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
a210: 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73  nl, szJ-12, &cks
a220: 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  um)).   || SQLIT
a230: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
a240: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
a250: 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d   aMagic, 8, szJ-
a260: 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70  8)).   || memcmp
a270: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
a280: 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c  lMagic, 8).   ||
a290: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
a2a0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a2b0: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
a2c0: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
a2d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a2e0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
a2f0: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
a300: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
a310: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a320: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30  ame */.  for(u=0
a330: 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20  ; u<len; u++){. 
a340: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73     cksum -= zMas
a350: 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66  ter[u];.  }.  if
a360: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
a370: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
a380: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
a390: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
a3a0: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
a3b0: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
a3c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
a3d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a3e0: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
a3f0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
a400: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
a410: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
a420: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
a430: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
a440: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
a450: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
a460: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
a470: 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20    len = 0;.  }. 
a480: 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20   zMaster[len] = 
a490: 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75  '\0';.   .  retu
a4a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a4b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a4c0: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
a4d0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
a4e0: 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  at or immediatel
a4f0: 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  y .** following 
a500: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61  the value in pPa
a510: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
a520: 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74   assuming a sect
a530: 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70  or .** size of p
a540: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
a550: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69  e bytes..**.** i
a560: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
a570: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
a580: 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e  **   Pager.journ
a590: 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52  alOff          R
a5a0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20  eturn value.**  
a5b0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35          0.**   5
a600: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
a610: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
a620: 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20    100           
a630: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
a640: 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20  **   2000       
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
a660: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
a670: 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72  c i64 journalHdr
a680: 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50  Offset(Pager *pP
a690: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
a6a0: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
a6b0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
a6c0: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
a6d0: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
a6e0: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
a6f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
a700: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
a710: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
a720: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
a730: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
a740: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
a750: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
a760: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
a770: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
a780: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a790: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66   );.  return off
a7a0: 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  set;.}../*.** Th
a7b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
a7c0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
a7d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a7e0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
a7f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a800: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
a810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
a820: 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65   not been writte
a830: 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74  n to.** within t
a840: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
a850: 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20  action (i.e. if 
a860: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
a870: 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  ==0)..**.** If d
a880: 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e  oTruncate is non
a890: 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67  -zero or the Pag
a8a0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
a8b0: 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a  mit variable is.
a8c0: 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65  ** set to 0, the
a8d0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  n truncate the j
a8e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a  ournal file to z
a8f0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
a900: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  e. Otherwise,.**
a910: 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74   zero the 28-byt
a920: 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20  e header at the 
a930: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
a940: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69  rnal file. In ei
a950: 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69  ther case, .** i
a960: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
a970: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
a980: 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
a990: 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69  rnal file immedi
a9a0: 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20  ately .** after 
a9b0: 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  writing or trunc
a9c0: 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ating it..**.** 
a9d0: 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  If Pager.journal
a9e0: 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74  SizeLimit is set
a9f0: 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20   to a positive, 
aa00: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
aa10: 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  and.** following
aa20: 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
aa30: 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72  or zeroing descr
aa40: 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73  ibed above the s
aa50: 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a  ize of the .** j
aa60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
aa70: 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74  ytes is larger t
aa80: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
aa90: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
aaa0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
aab0: 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e  e to Pager.journ
aac0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65  alSizeLimit byte
aad0: 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  s. The journal f
aae0: 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
aaf0: 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65  need to be synce
ab00: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  d following this
ab10: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
ab20: 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
ab30: 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e   occurs, abandon
ab40: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
ab50: 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72  return the IO er
ab60: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68  ror code..** Oth
ab70: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53  erwise, return S
ab80: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
ab90: 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72  tic int zeroJour
aba0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
abb0: 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e  ager, int doTrun
abc0: 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  cate){.  int rc 
abd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ac00: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61  turn code */.  a
ac10: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
ac20: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
ac30: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
ac40: 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f  nalOff ){.    co
ac50: 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d  nst i64 iLimit =
ac60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ac70: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a  SizeLimit;    /*
ac80: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
ac90: 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52  jsl */..    IOTR
aca0: 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25  ACE(("JZEROHDR %
acb0: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
acc0: 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74     if( doTruncat
acd0: 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29  e || iLimit==0 )
ace0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
acf0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
ad00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
ad10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
ad30: 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d  ar zeroHdr[28] =
ad40: 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d   {0};.      rc =
ad50: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ad60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72  pPager->jfd, zer
ad70: 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72  oHdr, sizeof(zer
ad80: 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d  oHdr), 0);.    }
ad90: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ada0: 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65  ITE_OK && !pPage
adb0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
adc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
add0: 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
ade0: 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  d, SQLITE_SYNC_D
adf0: 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e  ATAONLY|pPager->
ae00: 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
ae10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
ae20: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
ae30: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
ae40: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
ae50: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
ae60: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
ae70: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
ae80: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
ae90: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
aea0: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
aeb0: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
aec0: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
aed0: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
aee0: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
aef0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
af00: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
af10: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
af20: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
af30: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
af40: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
af50: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
af60: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
af70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
af80: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
af90: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
afa0: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
afb0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
afc0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
afd0: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
afe0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
aff0: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
b000: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
b010: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
b020: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
b030: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
b040: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
b050: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
b060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
b070: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
b080: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b090: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
b0a0: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
b0b0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
b0c0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
b0d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
b0e0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
b0f0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
b100: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
b110: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
b120: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
b130: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
b140: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
b150: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
b160: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
b170: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
b180: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
b190: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
b1a0: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
b1b0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
b1c0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
b1d0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
b1e0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
b1f0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
b200: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
b210: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
b220: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
b230: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
b240: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
b250: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
b260: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
b270: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
b280: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
b290: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
b2a0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
b2b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b2c0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
b2d0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b2e0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b2f0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
b300: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
b310: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
b320: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
b330: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
b340: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
b350: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
b360: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
b370: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
b380: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ageSize;     /* 
b390: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
b3a0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
b3b0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
b3c0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b3e0: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
b3f0: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
b400: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b430: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
b440: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
b450: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
b460: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
b470: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
b480: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
b490: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
b4a0: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
b4b0: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
b4c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
b4d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
b4e0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
b4f0: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
b500: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
b510: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
b520: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
b530: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
b540: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
b550: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
b560: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
b570: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
b580: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
b590: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
b5a0: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
b5b0: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
b5c0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
b5d0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
b5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
b5f0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
b600: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
b610: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b620: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
b630: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b640: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
b650: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
b660: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
b670: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
b680: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
b690: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
b6a0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
b6b0: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
b6c0: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
b6d0: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
b6e0: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
b6f0: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
b700: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
b710: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
b720: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
b730: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
b740: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
b750: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
b760: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
b770: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
b780: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
b790: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
b7a0: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
b7b0: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
b7c0: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
b7d0: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
b7e0: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
b7f0: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
b800: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
b810: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
b820: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
b830: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
b840: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
b850: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
b860: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
b870: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
b880: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b890: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
b8a0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
b8b0: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
b8c0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b8d0: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
b8e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
b8f0: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
b900: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
b910: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
b920: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
b930: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
b940: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
b950: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
b960: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
b970: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
b980: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
b990: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
b9a0: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
b9b0: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
b9c0: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
b9d0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
b9e0: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
b9f0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
ba00: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
ba10: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
ba20: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
ba30: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
ba40: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
ba50: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
ba60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
ba70: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
ba80: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
ba90: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
baa0: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
bab0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
bac0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
bad0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
bae0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
baf0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
bb00: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
bb10: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
bb20: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
bb30: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
bb40: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
bb50: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
bb60: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
bb70: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
bb80: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
bb90: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
bba0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
bbb0: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
bbc0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
bbd0: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
bbe0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
bbf0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
bc00: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
bc10: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
bc20: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
bc30: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
bc40: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
bc50: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
bc60: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
bc70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
bc80: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
bc90: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
bca0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
bcb0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
bcc0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
bcd0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
bce0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
bcf0: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
bd00: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
bd10: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
bd20: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
bd30: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
bd40: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
bd50: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
bd60: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
bd70: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
bd80: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
bd90: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
bda0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
bdb0: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
bdc0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
bdd0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
bde0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
bdf0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
be00: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
be10: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
be20: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
be30: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
be40: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
be50: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
be60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
be70: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
be80: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
be90: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
bea0: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
beb0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
bec0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
bed0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
bee0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
bef0: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
bf00: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
bf10: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
bf20: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
bf30: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
bf40: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
bf50: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
bf60: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
bf70: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
bf80: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
bf90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
bfa0: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
bfb0: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
bfc0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
bfd0: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
bfe0: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
bff0: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
c000: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
c010: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
c020: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
c030: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
c040: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
c050: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
c060: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
c070: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
c080: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
c090: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
c0a0: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
c0b0: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
c0c0: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
c0d0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
c0e0: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
c0f0: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
c100: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
c110: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
c120: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
c130: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
c140: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
c150: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
c160: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
c170: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
c180: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
c190: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
c1a0: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
c1b0: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
c1c0: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
c1d0: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
c1e0: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
c1f0: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
c200: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
c210: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
c220: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
c230: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
c240: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
c250: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
c260: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
c270: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
c280: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
c290: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
c2a0: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
c2b0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
c2c0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
c2d0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
c2e0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
c2f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c300: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
c310: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
c320: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
c330: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
c340: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
c350: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
c360: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
c370: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
c380: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
c390: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
c3a0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
c3b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
c3c0: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
c3d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
c3e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
c3f0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
c400: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
c410: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c420: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
c430: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
c440: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
c450: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
c460: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
c470: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
c480: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
c490: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
c4a0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
c4b0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
c4c0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
c4d0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
c4e0: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
c4f0: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
c500: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
c510: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
c520: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
c530: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
c540: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
c550: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
c560: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
c570: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
c580: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
c590: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
c5a0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
c5b0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
c5c0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
c5d0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
c5e0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
c5f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
c600: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
c610: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
c620: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
c630: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
c640: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
c650: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
c660: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
c670: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
c680: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
c690: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
c6a0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
c6b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
c6c0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
c6d0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
c6e0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
c6f0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
c700: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
c710: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
c720: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
c730: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
c740: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
c750: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c760: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
c770: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
c780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
c790: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
c7a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7c0: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
c7d0: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
c7e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c800: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
c810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
c820: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
c830: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
c840: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
c850: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
c860: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
c870: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
c8a0: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
c8b0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
c8c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
c8f0: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
c900: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
c910: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
c920: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
c930: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
c940: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
c950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c960: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
c970: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
c980: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
c990: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c9a0: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
c9b0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
c9c0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
c9d0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
c9e0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
c9f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
ca00: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
ca10: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
ca20: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
ca30: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
ca40: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
ca50: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
ca60: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
ca70: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
ca80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
ca90: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
caa0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
cab0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
cac0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
cad0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
cae0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
caf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
cb00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
cb10: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
cb20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
cb30: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
cb40: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
cb50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
cb60: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
cb70: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
cb80: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
cb90: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
cba0: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
cbb0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
cbc0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
cbd0: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
cbe0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
cbf0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
cc00: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
cc10: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
cc20: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
cc30: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
cc40: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
cc50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
cc60: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
cc70: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
cc80: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
cc90: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
cca0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ccb0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
ccc0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
ccd0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
cce0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
ccf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
cd00: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
cd10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cd20: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
cd30: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
cd40: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
cd50: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
cd60: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
cd70: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
cd80: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
cd90: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
cda0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
cdb0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
cdc0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
cdd0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
cde0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
cdf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
ce00: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
ce10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ce20: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
ce30: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
ce40: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ce50: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ce60: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
ce70: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
ce80: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
ce90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
cea0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ceb0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
cec0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
ced0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
cee0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
cef0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
cf00: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
cf10: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
cf20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
cf30: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
cf40: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
cf50: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
cf60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
cf70: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
cf80: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
cf90: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  eader */.    u16
cfa0: 20 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20   iPageSize16;   
cfb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
cfc0: 79 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69  y of iPageSize i
cfd0: 6e 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c  n 16-bit variabl
cfe0: 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  e */..    /* Rea
cff0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
d000: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
d010: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
d020: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
d030: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d040: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
d050: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
d060: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
d070: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
d080: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d090: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
d0a0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
d0b0: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
d0c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
d0d0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
d0e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
d0f0: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
d100: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
d110: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
d120: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
d130: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
d140: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
d150: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
d160: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
d170: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
d180: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
d190: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
d1a0: 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
d1b0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
d1c0: 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
d1d0: 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
d1e0: 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
d1f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d200: 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
d230: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
d240: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
d250: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
d260: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
d270: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
d280: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
d290: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
d2a0: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
d2b0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
d2c0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
d2d0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
d2e0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
d2f0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
d300: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
d310: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
d320: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
d330: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
d340: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
d350: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
d360: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
d370: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
d380: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
d390: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
d3a0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
d3b0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
d3c0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
d3d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
d3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
d3f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d400: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
d410: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
d420: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
d430: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
d440: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
d450: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
d460: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
d470: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
d480: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
d490: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
d4a0: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
d4b0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
d4c0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
d4d0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
d4e0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
d4f0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
d500: 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b  PageSize16, -1);
d510: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
d520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
d530: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
d540: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61  SQLITE_OK || iPa
d550: 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69  geSize16==(u16)i
d560: 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  PageSize );..   
d570: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
d580: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
d590: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
d5a0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
d5b0: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
d5c0: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
d5d0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
d5e0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
d5f0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
d600: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
d610: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
d620: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
d630: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
d640: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
d650: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
d660: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
d670: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
d680: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
d690: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
d6a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d6b0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
d6c0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
d6d0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
d6e0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
d6f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d700: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
d710: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
d720: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
d730: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
d740: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
d750: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
d760: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d770: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
d780: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
d790: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
d7a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d7b0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
d7c0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
d7d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
d7e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
d7f0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
d800: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
d810: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d820: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
d830: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
d840: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
d850: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
d860: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
d870: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
d880: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
d890: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
d8a0: 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
d8b0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
d8c0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
d8d0: 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
d8e0: 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
d8f0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
d900: 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
d910: 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
d920: 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
d930: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
d940: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
d950: 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
d960: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
d970: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
d980: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
d990: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
d9a0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
d9b0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
d9c0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
d9d0: 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
d9e0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
d9f0: 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
da00: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
da10: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
da20: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
da30: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
da40: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
da50: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
da60: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
da70: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
da80: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
da90: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
daa0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
dab0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
dac0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
daf0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db10: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
db20: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
db30: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
db40: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
db50: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
db60: 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
db70: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
db80: 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
dbb0: 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
dbc0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
dbd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
dbe0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
dbf0: 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
dc00: 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
dc10: 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
dc20: 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ster==0 );.  ass
dc30: 65 72 74 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c  ert( !zMaster ||
dc40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc50: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
dc60: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 20  NALMODE_WAL );. 
dc70: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
dc80: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
dc90: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
dca0: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
dcb0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
dcc0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
dcd0: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
dce0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
dcf0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
dd00: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
dd10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dd20: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
dd30: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
dd40: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
dd50: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
dd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
dd70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
dd80: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
dd90: 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
dda0: 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
ddb0: 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
ddc0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
ddd0: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
dde0: 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
ddf0: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
de00: 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
de10: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
de20: 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
de30: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
de40: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
de50: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
de60: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
de70: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
de80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
de90: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
dea0: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
deb0: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
dec0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
ded0: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
dee0: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
def0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
df00: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
df10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
df20: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
df30: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
df40: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
df50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
df60: 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
df70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
df80: 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
df90: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
dfa0: 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
dfb0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
dfc0: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
dfd0: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
dfe0: 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
dff0: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
e000: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
e010: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
e020: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
e030: 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
e040: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
e050: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
e060: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
e070: 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
e080: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
e090: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
e0a0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
e0b0: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
e0c0: 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
e0d0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
e0e0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
e0f0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
e100: 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
e110: 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
e120: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
e130: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
e140: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
e150: 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
e160: 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
e170: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e180: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
e190: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
e1a0: 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
e1b0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
e1c0: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
e1d0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
e1e0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
e1f0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
e200: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
e210: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
e220: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
e230: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
e240: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
e250: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
e260: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
e270: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
e280: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
e290: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
e2a0: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
e2b0: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
e2c0: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
e2d0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
e2e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
e2f0: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
e300: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
e310: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
e320: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
e330: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
e340: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
e350: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
e360: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
e370: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
e380: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
e390: 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
e3a0: 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
e3b0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
e3c0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
e3d0: 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
e3e0: 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
e3f0: 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
e400: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e410: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e420: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
e430: 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
e440: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e450: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
e460: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
e470: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
e480: 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a  number. Return.*
e490: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
e4a0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
e4b0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
e4c0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a   page is not .**
e4d0: 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f   already in memo
e4e0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  ry..*/.static Pg
e4f0: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
e500: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
e510: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
e520: 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
e550: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
e560: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
e570: 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68   a call to Pcach
e580: 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72  eFetch() with cr
e590: 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20  eateFlag==0 to. 
e5a0: 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20   ** fail, since 
e5b0: 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  no attempt to al
e5c0: 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d  locate dynamic m
e5d0: 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61  emory will be ma
e5e0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64  de..  */.  (void
e5f0: 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
e600: 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
e610: 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
e620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
e630: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74  ../*.** Unless t
e640: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
e650: 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63  rror-state, disc
e660: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
e670: 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74  y pages. If.** t
e680: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
e690: 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e  rror-state, then
e6a0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
e6b0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  no-op..**.** TOD
e6c0: 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f  O: Why can we no
e6d0: 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  t reset the page
e6e0: 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72  r while in error
e6f0: 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69   state?.*/.stati
e700: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
e710: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
e720: 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ){.  if( SQLITE_
e730: 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43  OK==pPager->errC
e740: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
e750: 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
e760: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
e770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
e780: 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
e790: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 7d  >pPCache);.  }.}
e7a0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
e7b0: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
e7c0: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
e7d0: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
e7e0: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
e7f0: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
e800: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
e810: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
e820: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
e830: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
e840: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
e850: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
e860: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
e870: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
e880: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
e890: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e8a0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
e8b0: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
e8c0: 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
e8d0: 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
e8e0: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
e8f0: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
e900: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
e910: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
e920: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
e930: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e940: 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
e950: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
e960: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
e970: 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
e980: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
e990: 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
e9a0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
e9b0: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
e9c0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
e9d0: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
e9e0: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
e9f0: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
ea00: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
ea10: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
ea20: 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
ea30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ea40: 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
ea50: 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
ea60: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
ea70: 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
ea80: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
ea90: 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
eaa0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
eab0: 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
eac0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
ead0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
eae0: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
eaf0: 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
eb00: 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
eb10: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
eb20: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
eb50: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
eb60: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
eb70: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
eb80: 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
eb90: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
eba0: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ebb0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ebc0: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
ebd0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
ebe0: 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
ebf0: 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
ec00: 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
ec10: 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
ec20: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
ec30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
ec40: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
ec50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ec60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
ec70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ec80: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
ec90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
eca0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ecb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
ecc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ecd0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
ece0: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
ecf0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
ed00: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ed10: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
ed20: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
ed30: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
ed40: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
ed50: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
ed60: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
ed70: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
ed80: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
ed90: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
eda0: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
edb0: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
edc0: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
edd0: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
ede0: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
edf0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ee00: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
ee10: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
ee20: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
ee30: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
ee40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ee50: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
ee60: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
ee70: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ee80: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
ee90: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
eea0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
eeb0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
eec0: 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73      int iDc = is
eed0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
eee0: 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  ?sqlite3OsDevice
eef0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ef00: 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a  pPager->fd):0;..
ef10: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
ef20: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
ef30: 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20  upport deletion 
ef40: 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74  of open files, t
ef50: 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65  hen.    ** close
ef60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ef70: 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
ef80: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
ef90: 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  k.  Otherwise.  
efa0: 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e    ** another con
efb0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
efc0: 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
efd0: 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68   might delete th
efe0: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  e file.    ** ou
eff0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
f000: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
f010: 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
f020: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
f030: 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
f040: 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
f050: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
f060: 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
f070: 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
f080: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
f090: 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
f0a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
f0b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
f0c0: 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31  DELETE   & 5)!=1
f0d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f0e0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
f0f0: 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
f100: 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
f110: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
f120: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26  LMODE_PERSIST  &
f130: 20 35 29 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 69   5)==1 );..    i
f140: 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
f150: 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
f160: 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
f170: 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
f180: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
f190: 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
f1a0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
f1b0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
f1c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
f1d0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
f1e0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
f1f0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
f200: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
f210: 0a 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  .    releaseAllS
f220: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
f230: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
f240: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
f250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f260: 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
f270: 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
f280: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
f290: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c        rc = osUnl
f2a0: 6f 63 6b 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  ock(pPager, NO_L
f2b0: 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OCK);.    }.    
f2c0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f2d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
f2e0: 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = rc;.    }.    
f2f0: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
f300: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
f310: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65  ..    /* If Page
f320: 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
f330: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
f340: 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
f350: 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20  e cannot be.    
f360: 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
f370: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66  that the pager f
f380: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
f390: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
f3a0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68   the.    ** cach
f3b0: 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
f3c0: 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ed and the error
f3d0: 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65   code safely cle
f3e0: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
f3f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
f400: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Code ){.      if
f410: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f420: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
f430: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
f440: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
f450: 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
f460: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  t(pPager);.    }
f470: 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ..    pPager->ch
f480: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
f490: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
f4a0: 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4e 4f  State = PAGER_NO
f4b0: 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  NE;.  }.}../*.**
f4c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
f4d0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
f4e0: 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43  when an IOERR, C
f4f0: 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65  ORRUPT or FULL e
f500: 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65  rror.** may have
f510: 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66   occurred. The f
f520: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
f530: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f540: 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75  e pager .** stru
f550: 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
f560: 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  d the error-code
f570: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
f580: 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
f590: 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f   .** API functio
f5a0: 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  n. The value ret
f5b0: 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
f5c0: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
f5d0: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68  gument .** to th
f5e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
f5f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
f600: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
f610: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
f620: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53  TE_CORRUPT, or S
f630: 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68  QLITE_FULL.** th
f640: 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20  e error becomes 
f650: 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69  persistent. Unti
f660: 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  l the persistent
f670: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
f680: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
f690: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
f6a0: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
f6b0: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
f6c0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
f6d0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
f6e0: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
f6f0: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
f700: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
f710: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
f720: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
f730: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
f740: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
f750: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
f760: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
f770: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
f780: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
f790: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
f7a0: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
f7b0: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
f7c0: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
f7d0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
f7e0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
f7f0: 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
f800: 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
f810: 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
f820: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
f830: 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
f840: 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
f850: 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
f860: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
f870: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
f880: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
f890: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
f8a0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
f8b0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
f8c0: 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
f8d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
f8e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
f8f0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
f900: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
f910: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
f920: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
f930: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
f940: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
f950: 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
f960: 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
f970: 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
f980: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
f990: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
f9a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f9b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
f9c0: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
f9d0: 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  n. A transaction
f9e0: 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65   is usually ende
f9f0: 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20  d by .** either 
fa00: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
fa10: 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e  LLBACK operation
fa20: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
fa30: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a  ay be called .**
fa40: 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20   after rollback 
fa50: 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
fa60: 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
fa70: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
fa80: 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75  ening.** the jou
fa90: 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69  rnal file or wri
faa0: 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69  ting the very fi
fab0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
fac0: 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62  er of a.** datab
fad0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ase transaction.
fae0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
faf0: 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
fb00: 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47 45 52  _SHARED or PAGER
fb10: 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68  _UNLOCK state wh
fb20: 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
fb30: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ne is called, it
fb40: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74   is a no-op (ret
fb50: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  urns SQLITE_OK).
fb60: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
fb70: 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
fb80: 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
fb90: 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
fba0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
fbb0: 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
fbc0: 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
fbd0: 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
fbe0: 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
fbf0: 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
fc00: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
fc10: 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
fc20: 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
fc30: 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
fc40: 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
fc50: 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
fc60: 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
fc70: 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
fc80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
fc90: 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
fca0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
fcb0: 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
fcc0: 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
fcd0: 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
fce0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
fcf0: 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
fd00: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
fd10: 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
fd20: 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
fd30: 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
fd40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
fd50: 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
fd60: 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
fd70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
fd80: 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
fd90: 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
fda0: 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
fdb0: 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
fdc0: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
fdd0: 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
fde0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
fdf0: 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
fe00: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
fe10: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
fe20: 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
fe30: 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
fe40: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
fe50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
fe60: 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
fe70: 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
fe80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
fe90: 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
fea0: 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
feb0: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
fec0: 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
fed0: 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
fee0: 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
fef0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
ff00: 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
ff10: 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
ff20: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
ff30: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
ff40: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
ff50: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
ff60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
ff70: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
ff80: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
ff90: 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
ffa0: 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
ffb0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
ffc0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
ffd0: 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
ffe0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
fff0: 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
10000 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
10010 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
10020 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
10030 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
10040 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
10050 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
10060 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
10070 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
10080 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
10090 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e  lized, if runnin
100a0 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
100b0 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  ve mode, the.** 
100c0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
100d0 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
100e0 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64 65  e (and downgrade
100f0 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  s the lock on th
10100 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
10110 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e  le accordingly).
10120 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
10130 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
10140 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
10150 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45 52   and is in PAGER
10160 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a  _SYNCED state,.*
10170 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50 41  * it moves to PA
10180 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e  GER_EXCLUSIVE. N
10190 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e  o locks are down
101a0 67 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e 6e  graded when runn
101b0 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73  ing in.** exclus
101c0 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ive mode..**.** 
101d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
101e0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
101f0 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
10200 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
10210 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
10220 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
10230 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
10240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
10250 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
10260 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
10270 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
10280 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
10290 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
102a0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
102b0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
102c0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
102d0 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
102e0 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
102f0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
10300 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
10310 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
10320 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
10330 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
10340 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
10350 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
10360 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
10370 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
10380 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
10390 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
103a0 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
103b0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
103c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
103d0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
103e0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
103f0 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
10400 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10410 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
10420 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
10430 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
10440 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ation operation 
10450 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  */.  int rc2 = S
10460 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
10470 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
10480 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20   db file unlock 
10490 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
104a0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
104b0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
104c0 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  not have an open
104d0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
104e0 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
104f0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
10500 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
10510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
10520 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
10530 5f 49 4e 49 54 49 41 4c 20 26 26 20 70 50 61 67  _INITIAL && pPag
10540 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
10550 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
10560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10570 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
10580 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
10590 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
105a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
105b0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
105c0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
105d0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
105e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
105f0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
10600 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
10610 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
10620 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
10630 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
10640 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
10650 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
10660 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10670 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10680 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10690 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
106a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
106b0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
106c0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
106d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
106e0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
106f0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
10700 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
10710 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10720 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
10730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10740 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10760 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
10770 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
10780 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
10790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
107a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
107b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
107c0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
107d0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
107e0 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
107f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
10800 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
10810 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
10820 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
10830 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
10840 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
10850 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
10860 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
10870 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10880 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
10890 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
108a0 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
108b0 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
108c0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
108d0 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
108e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
108f0 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
10900 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
10910 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
10920 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
10930 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
10940 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
10950 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
10960 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
10970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
10980 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
10990 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
109a0 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
109b0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
109c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
109d0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
109e0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
109f0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
10a00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10a10 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10a20 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
10a30 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
10a40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
10a50 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
10a60 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
10a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
10a80 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
10a90 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
10aa0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
10ab0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10ac0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10ad0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
10ae0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
10af0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
10b00 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
10b10 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
10b20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
10b30 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
10b40 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
10b50 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
10b60 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
10b70 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
10b80 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
10b90 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
10ba0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
10bb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
10bc0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
10bd0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
10be0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
10bf0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54    sqlite3PcacheT
10c00 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
10c10 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d  pPCache, pPager-
10c20 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  >dbSize);..  if(
10c30 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
10c40 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ger) ){.    /* D
10c50 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74  rop the WAL writ
10c60 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20  e-lock, if any. 
10c70 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e  Also, if the con
10c80 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a  nection was in .
10c90 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d      ** locking_m
10ca0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
10cb0 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
10cc0 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58  ger, drop the EX
10cd0 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20  CLUSIVE .    ** 
10ce0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
10cf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
10d00 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d      */.    rc2 =
10d10 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72   sqlite3WalEndWr
10d20 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
10d30 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
10d40 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53    assert( rc2==S
10d50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
10d60 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
10d70 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71  lusiveMode && sq
10d80 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
10d90 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
10da0 61 6c 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  al, 0) ){.      
10db0 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
10dc0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
10dd0 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  CK);.    }.  }el
10de0 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
10df0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
10e00 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
10e10 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
10e20 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
10e30 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
10e40 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
10e50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
10e60 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
10e70 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
10e80 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
10e90 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
10ea0 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
10eb0 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
10ec0 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
10ed0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
10ee0 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
10ef0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
10f00 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
10f10 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
10f20 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
10f30 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
10f40 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
10f50 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
10f60 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
10f70 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
10f80 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
10f90 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
10fa0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
10fb0 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
10fc0 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
10fd0 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
10fe0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c  base file and cl
10ff0 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
11000 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ate. If this mea
11010 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  ns that.** there
11020 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
11030 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
11040 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
11050 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ext connection.*
11060 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  * to obtain a sh
11070 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
11080 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
11090 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77  y be this one) w
110a0 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62  ill.** roll it b
110b0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
110c0 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
110d0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
110e0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
110f0 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
11100 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
11110 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
11120 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
11130 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
11140 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
11150 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
11160 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63  rror state. Whic
11170 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
11180 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
11190 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
111a0 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
111b0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
111c0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
111d0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
111e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
111f0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
11200 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
11210 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
11220 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
11230 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20 29  WRITER_INITIAL )
11240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
11250 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
11260 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
11270 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
11280 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
11290 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
112a0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
112b0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c  e if( pPager->eL
112c0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
112d0 43 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  CK && !pPager->e
112e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
112f0 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f        pager_end_
11300 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
11310 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
11320 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
11330 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
11340 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
11350 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
11360 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
11370 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
11380 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
11390 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
113a0 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
113b0 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
113c0 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
113d0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
113e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
113f0 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
11400 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
11410 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
11420 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
11430 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
11440 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
11450 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
11460 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
11470 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
11480 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
11490 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
114a0 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
114b0 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
114c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
114d0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
114e0 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
114f0 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
11500 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
11510 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
11520 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
11530 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
11540 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
11550 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
11560 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
11570 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
11580 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
11590 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
115a0 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
115b0 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
115c0 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
115d0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
115e0 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
115f0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
11600 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
11610 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
11620 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
11630 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
11640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
11650 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
11660 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
11670 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
11680 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
11690 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
116a0 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
116b0 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
116c0 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
116d0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
116e0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
116f0 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
11700 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
11710 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
11720 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
11730 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
11740 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
11750 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
11760 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
11770 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
11780 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
11790 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
117a0 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
117b0 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
117c0 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
117d0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
117e0 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
117f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
11800 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
11810 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
11820 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
11830 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
11840 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
11850 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
11860 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
11870 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
11880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11890 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
118a0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
118b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
118c0 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
118d0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
118e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11900 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
11910 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
11920 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
11930 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
11940 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
11950 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
11960 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
11970 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
11980 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
11990 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
119a0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
119b0 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
119c0 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
119d0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
119e0 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
119f0 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
11a00 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
11a10 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
11a20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
11a30 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
11a40 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
11a50 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
11a60 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
11a70 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
11a80 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
11a90 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d  l..**.** The isM
11aa0 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20  ainJrnl flag is 
11ab0 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
11ac0 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
11ad0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a  k journal and.**
11ae0 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73   false for the s
11af0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11b00 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  .  The main roll
11b10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
11b20 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d  s.** checksums -
11b30 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11b40 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e  ournal does not.
11b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11b60 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
11b70 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
11b80 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
11b90 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
11ba0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11bb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
11bc0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
11bd0 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
11be0 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
11bf0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
11c00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
11c10 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
11c20 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
11c30 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
11c40 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
11c50 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
11c60 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
11c70 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
11c80 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
11c90 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
11ca0 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
11cb0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
11cc0 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
11cd0 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
11ce0 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
11cf0 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
11d00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
11d10 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
11d20 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
11d30 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
11d40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11d50 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
11d60 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
11d70 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
11d80 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
11d90 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
11da0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
11db0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
11dc0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
11dd0 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
11de0 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
11df0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
11e00 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
11e10 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
11e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11e30 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
11e40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
11e50 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
11e60 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
11e70 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
11e80 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
11e90 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
11ea0 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
11eb0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
11ec0 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
11ed0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
11ee0 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
11ef0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
11f00 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
11f10 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
11f20 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
11f30 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
11f40 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
11f50 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
11f60 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
11f70 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
11f80 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
11f90 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
11fa0 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
11fb0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
11fc0 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
11fd0 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
11fe0 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
11ff0 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
12000 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
12010 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
12020 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
12030 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
12040 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
12050 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
12060 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
12070 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
12080 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
12090 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
120a0 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
120b0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
120c0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
120d0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
120e0 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
120f0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
12100 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12120 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
12130 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
12140 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12160 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
12170 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
12180 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
12190 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
121a0 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
121b0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
121c0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
121d0 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
121e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
121f0 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
12200 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
12210 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
12220 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
12230 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
12240 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
12250 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
12260 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
12270 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
12280 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
12290 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
122a0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
122b0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
122c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
122d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
122e0 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
122f0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
12300 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
12310 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
12320 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
12330 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
12340 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12360 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
12370 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
12380 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
12390 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
123a0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
123b0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
123c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
123d0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
123e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
123f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
12400 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
12410 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
12420 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
12430 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
12440 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
12450 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
12460 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
12470 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
12480 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
12490 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
124a0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
124b0 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
124c0 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
124d0 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
124e0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
124f0 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
12500 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
12510 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
12520 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
12530 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
12540 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
12550 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
12560 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
12570 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
12580 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
12590 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
125a0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
125b0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
125c0 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
125d0 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
125e0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
125f0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
12600 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
12610 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
12620 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
12630 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
12640 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
12650 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
12660 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
12670 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
12680 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
12690 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
126a0 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
126b0 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
126c0 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
126d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
126e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
126f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
12700 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
12710 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
12720 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
12730 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
12740 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12750 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
12760 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
12770 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
12780 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
12790 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
127a0 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
127b0 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
127c0 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
127d0 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
127e0 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
127f0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
12800 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
12810 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
12820 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
12830 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
12840 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
12850 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
12860 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
12870 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
12880 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
12890 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
128a0 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
128b0 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
128c0 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
128d0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
128e0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
128f0 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
12900 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
12910 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
12920 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
12930 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
12940 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
12950 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
12960 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
12970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12980 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
12990 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
129a0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
129b0 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
129c0 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
129d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
129e0 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
129f0 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
12a00 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
12a10 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
12a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12a30 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
12a40 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
12a50 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
12a60 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65  een played by be
12a70 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
12a80 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
12a90 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
12aa0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
12ab0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
12ac0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
12ad0 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
12ae0 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
12af0 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
12b00 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
12b10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
12b20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
12b30 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
12b40 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 0a 20 20  _CACHEMOD );..  
12b50 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
12b60 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
12b70 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
12b80 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
12b90 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
12ba0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
12bb0 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
12bc0 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
12bd0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
12be0 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
12bf0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
12c00 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
12c10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
12c20 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
12c30 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
12c40 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
12c50 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
12c60 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
12c70 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
12c80 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
12c90 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
12ca0 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
12cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
12cc0 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
12cd0 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
12ce0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
12cf0 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
12d00 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
12d10 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
12d20 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
12d30 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
12d40 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
12d50 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
12d60 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
12d70 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
12d80 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
12d90 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
12da0 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
12db0 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
12dc0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
12dd0 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
12de0 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
12df0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
12e00 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
12e10 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
12e20 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
12e30 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
12e40 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
12e50 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
12e60 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
12e70 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
12e80 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
12e90 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
12ea0 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
12eb0 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
12ec0 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
12ed0 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
12ee0 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
12ef0 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
12f00 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
12f10 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
12f20 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
12f30 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
12f40 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
12f50 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
12f60 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
12f70 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
12f80 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
12f90 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
12fa0 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
12fb0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
12fc0 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
12fd0 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
12fe0 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
12ff0 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
13000 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
13010 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
13020 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
13030 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
13040 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13050 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
13060 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
13070 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
13080 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
13090 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
130a0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
130b0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
130c0 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
130d0 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
130e0 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
130f0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
13100 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
13110 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
13120 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
13130 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
13140 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
13150 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
13160 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
13170 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
13180 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
13190 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
131a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
131b0 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
131c0 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
131d0 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
131e0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
131f0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
13200 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
13210 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
13220 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
13230 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
13240 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
13250 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
13260 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
13270 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
13280 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
13290 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
132a0 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
132b0 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
132c0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
132d0 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
132e0 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
132f0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
13300 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
13310 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
13320 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
13330 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
13340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
13350 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
13360 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
13370 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13380 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
13390 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
133a0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
133b0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
133c0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
133d0 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
133e0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
133f0 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
13400 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
13410 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
13420 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
13430 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
13440 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
13450 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61  pageSize, (u8*)a
13460 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
13470 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
13480 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
13490 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
134a0 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  ;.  if( isMainJr
134b0 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63  nl ){.    isSync
134c0 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ed = pPager->noS
134d0 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74  ync || (*pOffset
134e0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
134f0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65  nalHdr);.  }else
13500 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
13510 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
13520 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
13530 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a  DR_NEED_SYNC));.
13540 20 20 7d 0a 20 20 69 66 28 20 28 70 50 61 67 65    }.  if( (pPage
13550 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
13560 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 29 0a 20  _WRITER_DBMOD). 
13570 20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67    && isOpen(pPag
13580 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 69 73  er->fd).   && is
13590 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
135a0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
135b0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
135c0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
135d0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
135e0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
135f0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
13600 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
13610 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13620 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
13630 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
13640 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
13650 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
13660 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
13670 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
13680 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
13690 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
136a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
136b0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
136c0 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
136d0 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
136e0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
136f0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
13700 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
13710 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
13720 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
13730 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
13740 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
13750 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
13760 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
13770 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
13780 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
13790 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
137a0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
137b0 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
137c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
137d0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
137e0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
137f0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
13800 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
13810 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
13820 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
13830 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
13840 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
13850 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
13860 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
13870 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
13880 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
13890 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
138a0 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
138b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
138c0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
138d0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
138e0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
138f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
13900 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
13910 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
13920 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
13930 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
13940 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
13950 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
13960 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
13970 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
13980 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
13990 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
139a0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
139b0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
139c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
139d0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
139e0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
139f0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
13a00 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
13a10 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
13a20 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
13a30 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
13a40 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
13a50 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
13a60 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
13a70 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
13a80 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
13a90 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
13aa0 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
13ab0 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
13ac0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
13ad0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
13ae0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
13af0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
13b00 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
13b10 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
13b20 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
13b30 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
13b40 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
13b50 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
13b60 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
13b70 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
13b80 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
13b90 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
13ba0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
13bb0 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
13bc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13bd0 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
13be0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
13bf0 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
13c00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13c10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13c20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
13c30 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
13c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
13c50 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
13c60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
13c70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
13c80 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
13c90 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
13ca0 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
13cb0 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
13cc0 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
13cd0 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
13ce0 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
13cf0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
13d00 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
13d10 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
13d20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
13d30 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
13d40 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
13d50 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
13d60 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
13d70 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
13d80 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
13d90 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
13da0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
13db0 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
13dc0 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
13dd0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
13de0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
13df0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
13e00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
13e10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
13e20 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
13e30 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
13e40 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
13e50 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
13e60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
13e70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
13e80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
13e90 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
13ea0 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
13eb0 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
13ec0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
13ed0 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
13ee0 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
13ef0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
13f00 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
13f10 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
13f20 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
13f30 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
13f40 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
13f50 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
13f60 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
13f70 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
13f80 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
13f90 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
13fa0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
13fb0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
13fc0 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
13fd0 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
13fe0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
13ff0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
14000 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
14010 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
14020 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
14030 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
14040 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
14050 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
14060 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
14070 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
14080 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
14090 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
140a0 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
140b0 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
140c0 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
140d0 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
140e0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
140f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
14100 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
14110 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
14120 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
14130 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
14140 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
14150 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
14160 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
14170 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
14180 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
14190 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
141a0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
141b0 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
141c0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
141d0 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
141e0 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
141f0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
14200 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
14210 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
14220 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
14230 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
14240 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
14250 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
14260 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
14270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
14280 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
14290 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
142a0 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
142b0 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
142c0 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
142d0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
142e0 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
142f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14300 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
14310 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
14320 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
14330 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
14340 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
14350 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14360 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
14370 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
14380 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
14390 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
143a0 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
143b0 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
143c0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
143d0 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
143e0 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
143f0 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
14400 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
14410 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
14420 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
14430 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
14440 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
14450 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
14460 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14470 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
14480 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
14490 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
144a0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
144b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
144c0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
144d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
144e0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
144f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14510 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
14520 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
14530 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14540 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
14550 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
14560 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
14570 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14580 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
14590 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
145a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
145b0 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
145c0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
145d0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
145e0 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
145f0 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
14600 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
14610 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
14620 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
14630 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
14640 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
14650 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
14660 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
14670 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
14680 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
14690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
146a0 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
146b0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
146c0 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
146d0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
146e0 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
146f0 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
14700 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
14710 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
14720 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
14730 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
14740 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
14750 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
14760 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
14770 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
14780 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
14790 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
147a0 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
147b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
147c0 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
147d0 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
147e0 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
147f0 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
14800 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
14810 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
14820 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
14830 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
14840 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
14850 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
14860 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
14870 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
14880 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
14890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
148a0 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
148b0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
148c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
148d0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
148e0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
148f0 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
14900 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
14910 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
14920 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
14930 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
14940 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
14950 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
14960 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
14970 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
14980 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
14990 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
149a0 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
149b0 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
149c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
149d0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
149e0 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
149f0 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
14a00 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
14a10 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
14a20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
14a30 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
14a40 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
14a50 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
14a60 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
14a70 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
14a80 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
14a90 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
14aa0 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
14ab0 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
14ac0 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
14ad0 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
14ae0 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
14af0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14b00 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
14b10 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
14b20 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
14b30 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
14b40 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
14b50 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
14b60 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
14b70 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
14b80 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
14b90 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
14ba0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
14bb0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
14bc0 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
14bd0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
14be0 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
14bf0 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
14c00 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
14c10 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
14c20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14c30 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
14c40 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
14c50 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
14c60 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
14c70 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
14c80 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
14c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
14ca0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
14cb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
14cc0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
14cd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
14ce0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
14cf0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
14d20 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
14d30 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
14d40 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
14d50 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
14d60 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
14d70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
14d80 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
14d90 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
14da0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
14db0 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
14dc0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
14dd0 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
14de0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
14df0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
14e00 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
14e10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14e20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14e30 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
14e40 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
14e50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
14e60 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
14e70 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
14e80 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
14e90 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
14ea0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
14eb0 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
14ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
14ed0 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
14ee0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
14ef0 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
14f00 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
14f10 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
14f20 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
14f30 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
14f40 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
14f50 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
14f60 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
14f70 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
14f80 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
14f90 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
14fa0 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
14fb0 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
14fc0 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
14fd0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
14fe0 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
14ff0 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
15000 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
15010 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
15020 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
15030 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
15040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15050 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
15060 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
15070 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
15080 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
15090 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
150a0 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
150b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
150c0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
150d0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
150e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
150f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
15100 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
15110 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
15120 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
15130 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
15140 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
15150 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
15160 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
15170 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
15180 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
15190 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
151a0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
151b0 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
151c0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
151d0 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
151e0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
151f0 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
15200 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
15210 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
15220 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15230 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
15240 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
15250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15260 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
15270 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
15280 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
15290 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
152a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
152b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
152c0 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
152d0 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
152e0 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
152f0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
15300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15310 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
15320 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
15330 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
15340 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
15350 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
15360 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
15370 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
15380 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
15390 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
153a0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
153b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
153c0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
153d0 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
153e0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
153f0 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
15400 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
15410 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
15420 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
15430 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
15440 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
15450 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
15460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
15470 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
15480 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
15490 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
154a0 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
154b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
154c0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
154d0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
154e0 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
154f0 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
15500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
15510 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
15520 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
15530 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
15540 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
15550 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
15560 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
15570 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
15580 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
15590 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
155a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
155b0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
155c0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
155d0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
155e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
155f0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
15600 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
15610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15620 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
15630 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
15640 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
15650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15670 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
15680 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
15690 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
156a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
156b0 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
156c0 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
156d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
156e0 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
156f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15710 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
15720 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
15730 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
15740 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
15750 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
15760 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
15770 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
15780 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
15790 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
157a0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
157b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
157c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
157d0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
157e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
157f0 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
15800 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
15810 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
15820 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
15830 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
15840 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
15850 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
15860 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
15870 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
15880 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
15890 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
158a0 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
158b0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
158c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
158d0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
158e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
158f0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
15900 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15910 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
15920 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
15930 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
15940 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
15950 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
15960 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
15970 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
15980 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
15990 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
159a0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
159b0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
159c0 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
159d0 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
159e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
159f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
15a00 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
15a10 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
15a20 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
15a30 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c  ck is not.** hel
15a40 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
15a50 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
15a60 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
15a70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a   of the file is.
15a80 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  ** changed to nP
15a90 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
15aa0 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
15ab0 65 20 62 79 74 65 73 29 2e 20 49 66 20 74 68 65  e bytes). If the
15ac0 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b   file.** on disk
15ad0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
15ae0 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
15af0 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
15b00 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
15b10 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
15b20 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
15b30 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
15b40 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
15b50 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
15b60 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
15b70 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
15b80 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
15b90 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
15ba0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
15bb0 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
15bc0 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
15bd0 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
15be0 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
15bf0 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
15c00 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
15c10 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
15c20 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
15c30 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
15c40 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
15c50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15c60 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
15c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
15c80 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
15c90 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
15ca0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
15cb0 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
15cc0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
15cd0 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
15ce0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
15cf0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
15d00 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
15d10 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
15d20 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
15d30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15d40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
15d50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
15d60 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
15d70 44 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  D && isOpen(pPag
15d80 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
15d90 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
15da0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
15db0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
15dc0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
15dd0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
15de0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
15df0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
15e00 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
15e10 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
15e20 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
15e30 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
15e40 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
15e50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
15e60 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
15e70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
15e80 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
15e90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
15ea0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
15eb0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
15ec0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
15ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
15ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
15ef0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
15f00 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
15f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15f30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
15f40 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
15f50 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
15f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15f70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15f80 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
15f90 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
15fa0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
15fb0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
15fc0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
15fd0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
15fe0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
15ff0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
16000 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
16010 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
16020 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
16030 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
16040 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
16050 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
16060 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
16070 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
16080 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
16090 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
160a0 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
160b0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
160c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
160d0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
160e0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
160f0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
16100 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
16110 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
16120 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
16130 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
16140 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
16150 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
16160 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
16170 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
16180 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
16190 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
161a0 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
161b0 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
161c0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
161d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
161e0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
161f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
16200 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
16210 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
16220 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
16230 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
16240 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
16250 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
16260 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
16270 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
16280 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
16290 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
162a0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
162b0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
162c0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
162d0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
162e0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
162f0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
16300 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
16310 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
16320 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
16330 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
16340 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
16350 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
16360 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
16370 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
16380 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
16390 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
163a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
163b0 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
163c0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
163d0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
163e0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
163f0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
16400 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
16410 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
16420 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
16430 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
16440 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16450 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
16460 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
16470 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
16480 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
16490 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
164a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
164b0 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
164c0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
164d0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
164e0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
164f0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
16500 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
16510 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
16520 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
16530 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
16540 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
16550 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
16560 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
16570 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
16580 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
16590 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
165a0 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
165b0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
165c0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
165d0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
165e0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
165f0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
16600 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
16610 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
16620 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
16630 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
16640 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
16650 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
16660 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
16670 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
16680 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
16690 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
166a0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
166b0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
166c0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
166d0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
166e0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
166f0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
16700 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
16710 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
16720 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
16730 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
16740 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
16750 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
16760 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
16770 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
16780 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
16790 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
167a0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
167b0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
167c0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
167d0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
167e0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
167f0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
16800 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
16810 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
16820 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
16830 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
16840 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
16850 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
16860 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
16870 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
16880 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
16890 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
168a0 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
168b0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
168c0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
168d0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
168e0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
168f0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
16900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
16910 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
16920 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
16930 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
16940 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
16950 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
16960 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
16970 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
16980 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
16990 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
169a0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
169b0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
169c0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
169d0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
169e0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
169f0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
16a00 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
16a10 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
16a20 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
16a30 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
16a40 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
16a50 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
16a60 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
16a70 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
16a80 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
16a90 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
16aa0 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
16ab0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
16ac0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
16ad0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
16ae0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
16af0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
16b00 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
16b10 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
16b20 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
16b30 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
16b40 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
16b50 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
16b60 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
16b70 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
16b80 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
16b90 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
16ba0 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
16bb0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
16bc0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
16bd0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
16be0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
16bf0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
16c00 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
16c10 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
16c20 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
16c30 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
16c40 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
16c50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16c60 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
16c70 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
16c80 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
16c90 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
16ca0 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
16cb0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
16cc0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
16cd0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
16ce0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
16cf0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
16d00 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
16d10 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
16d20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
16d30 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
16d40 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
16d50 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
16d60 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
16d70 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
16d80 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
16d90 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
16da0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
16db0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
16dc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
16de0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
16df0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
16e00 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
16e10 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
16e20 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
16e30 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
16e40 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
16e50 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
16e60 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
16e70 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
16e80 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
16e90 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
16ea0 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
16eb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
16ec0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
16ed0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16ee0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
16ef0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
16f00 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
16f10 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
16f20 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
16f30 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
16f40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
16f50 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
16f60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
16f70 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
16f80 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
16f90 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
16fa0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
16fb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
16fc0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
16fd0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
16fe0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
16ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17000 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
17010 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
17020 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17040 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
17050 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
17060 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
17070 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
17080 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
17090 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
170a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
170b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
170c0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
170d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
170e0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
170f0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
17100 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
17110 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
17120 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
17130 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
17140 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
17150 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
17160 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
17170 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
17180 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
17190 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
171a0 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
171b0 20 2a 2f 0a 0a 20 20 69 66 28 20 21 69 73 4f 70   */..  if( !isOp
171c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
171d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
171e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
171f0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
17200 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
17210 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
17220 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
17230 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
17240 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
17250 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
17260 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
17270 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
17280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17290 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
172a0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
172b0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
172c0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
172d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
172e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
172f0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
17300 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
17310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17320 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
17330 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
17340 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
17350 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
17360 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
17370 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
17380 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
17390 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
173a0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
173b0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
173c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
173d0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
173e0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
173f0 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
17400 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
17410 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
17420 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
17430 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
17440 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
17450 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
17460 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
17470 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
17480 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
17490 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
174a0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
174b0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
174c0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
174d0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
174e0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
174f0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
17500 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
17510 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
17520 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
17530 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
17540 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
17550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17560 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
17570 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
17580 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
17590 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
175a0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
175b0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
175c0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
175d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
175e0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
175f0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
17600 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
17610 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17620 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
17630 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
17640 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
17650 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
17660 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
17670 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
17680 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
17690 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
176a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
176b0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
176c0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
176d0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
176e0 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
176f0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
17700 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
17710 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
17720 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
17730 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
17740 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
17750 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
17760 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
17770 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
17780 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
17790 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
177a0 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
177b0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
177c0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
177d0 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
177e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
177f0 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
17800 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
17810 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
17820 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
17830 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
17840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17850 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
17860 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
17870 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
17890 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
178a0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
178b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
178c0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
178d0 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
178e0 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
178f0 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
17900 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
17910 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
17920 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
17930 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
17940 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
17950 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
17960 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
17970 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
17980 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
17990 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
179a0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
179b0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
179c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
179d0 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
179e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
179f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
17a00 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
17a10 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
17a20 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
17a30 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
17a40 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
17a50 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
17a60 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
17a70 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
17a80 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
17a90 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
17aa0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
17ab0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
17ac0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
17ad0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
17ae0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
17af0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
17b00 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
17b10 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
17b20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
17b30 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
17b40 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
17b50 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
17b60 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
17b70 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
17b80 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
17b90 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
17ba0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
17bb0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
17bc0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
17bd0 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
17be0 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
17bf0 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
17c00 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
17c10 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
17c20 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
17c30 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
17c40 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
17c50 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
17c60 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
17c70 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
17c80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
17c90 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
17ca0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
17cb0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
17cc0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
17cd0 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
17ce0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
17cf0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
17d00 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
17d10 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
17d20 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
17d30 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
17d40 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
17d50 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
17d60 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
17d70 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
17d80 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
17d90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
17da0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17db0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
17dc0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
17dd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17de0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
17df0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
17e00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
17e10 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
17e20 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
17e30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
17e40 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
17e50 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
17e60 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17e70 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
17e80 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
17e90 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
17ea0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
17eb0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
17ec0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
17ed0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
17ee0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
17ef0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
17f00 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
17f10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
17f20 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
17f30 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
17f40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17f50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
17f60 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
17f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
17f80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17f90 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
17fa0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
17fb0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
17fc0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
17fd0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
17fe0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
17ff0 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
18000 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
18010 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
18020 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
18030 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
18040 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
18050 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
18060 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
18070 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
18080 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
18090 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
180a0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
180b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
180c0 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
180d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
180e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
180f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
18100 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
18110 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18120 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
18130 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
18140 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
18150 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
18160 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
18170 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
18180 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
18190 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
181a0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
181b0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
181c0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
181d0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
181e0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
181f0 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
18200 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
18210 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
18220 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
18230 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
18240 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
18250 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
18260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
18270 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
18280 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
18290 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
182a0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
182b0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
182c0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
182d0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
182e0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
182f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
18300 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
18310 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
18320 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
18330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
18340 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
18350 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
18360 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
18370 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
18380 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
18390 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
183a0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
183b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
183c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
183d0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
183e0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
183f0 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
18400 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
18410 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
18420 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
18430 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
18440 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
18450 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
18460 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
18470 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
18480 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18490 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
184a0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
184b0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
184c0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
184d0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
184e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
184f0 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
18500 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
18510 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
18520 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
18530 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18540 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
18550 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
18560 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
18570 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
18580 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
18590 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
185a0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
185b0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
185c0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
185d0 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
185e0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
185f0 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
18600 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
18610 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
18620 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
18630 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
18640 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
18650 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
18660 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
18670 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
18680 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
18690 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
186a0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
186b0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
186c0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
186d0 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
186e0 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
186f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
18700 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
18710 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
18720 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
18730 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
18740 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
18750 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
18760 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
18770 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
18780 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
18790 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
187a0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
187b0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
187c0 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
187d0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
187e0 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
187f0 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
18800 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
18810 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
18820 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
18830 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
18840 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
18850 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
18860 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
18870 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
18880 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
18890 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
188a0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
188b0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
188c0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
188d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
188e0 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
188f0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
18900 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
18910 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
18920 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
18930 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
18940 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
18950 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
18960 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
18970 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
18980 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
18990 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 70 50  er->noSync && pP
189a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
189b0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
189c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
189d0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
189e0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
189f0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
18a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18a10 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
18a20 6e 6f 53 79 6e 63 20 26 26 20 70 50 61 67 65 72  noSync && pPager
18a30 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
18a40 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
18a50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18a60 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
18a70 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
18a80 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  flags);.  }.  if
18a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18aa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
18ab0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
18ac0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
18ad0 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20  r[0]!='\0');.   
18ae0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
18af0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
18b00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18b10 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
18b20 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
18b30 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
18b40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18b50 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
18b60 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
18b70 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
18b80 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
18b90 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
18ba0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18bb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
18bc0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
18bd0 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
18be0 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
18bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18c00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
18c10 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
18c20 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
18c30 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
18c40 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
18c50 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
18c60 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
18c70 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
18c80 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
18c90 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
18ca0 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
18cb0 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
18cc0 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
18cd0 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
18ce0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
18cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
18d00 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
18d10 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
18d20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
18d30 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
18d40 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
18d50 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
18d60 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
18d70 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
18d80 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
18d90 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
18da0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18db0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
18dc0 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
18dd0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
18de0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
18df0 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
18e00 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
18e10 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
18e20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
18e30 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
18e40 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
18e50 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
18e60 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
18e70 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
18e80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18e90 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
18ea0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
18eb0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
18ec0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
18ed0 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
18ee0 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
18ef0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
18f00 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
18f10 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
18f20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
18f30 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
18f40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18f50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
18f60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
18f70 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20    int isInWal = 
18f80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
18f90 2a 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69  * True if page i
18fa0 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  s in log file */
18fb0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
18fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
18fd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
18fe0 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
18ff0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19000 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
19010 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
19020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
19030 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
19040 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
19050 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
19060 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65  fd)) ){.    asse
19070 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
19080 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  File );.    mems
19090 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
190a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
190b0 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ze);.    return 
190c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
190d0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
190e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
190f0 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20   /* Try to pull 
19100 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
19110 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
19120 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
19130 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50  qlite3WalRead(pP
19140 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
19150 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a  , &isInWal, pgsz
19160 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
19170 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
19180 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57  ITE_OK && !isInW
19190 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f  al ){.    i64 iO
191a0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
191b0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
191c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
191d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
191e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
191f0 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66  pData, pgsz, iOf
19200 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
19210 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
19220 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
19230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19240 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
19250 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
19260 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19270 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
19280 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
19290 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
192a0 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
192b0 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
192c0 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
192d0 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
192e0 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
192f0 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
19300 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
19310 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
19320 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
19330 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
19340 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
19350 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
19360 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
19370 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
19380 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
19390 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
193a0 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
193b0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
193c0 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
193d0 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
193e0 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
193f0 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
19400 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
19410 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
19420 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19430 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
19440 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
19450 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
19460 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
19470 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
19480 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19490 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
194a0 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
194b0 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
194c0 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67  ** white noising
194d0 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
194e0 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
194f0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
19500 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
19510 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
19520 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
19530 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
19540 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
19550 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
19560 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
19570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19580 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
19590 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
195a0 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
195b0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
195c0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
195d0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
195e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
195f0 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
19600 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
19610 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
19620 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
19630 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45  _NOMEM);..  PAGE
19640 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
19650 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
19660 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
19670 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
19680 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
19690 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
196a0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41  er, pgno));.  PA
196b0 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
196c0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
196d0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
196e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
196f0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
19700 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
19710 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  pPg)));..  retur
19720 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
19730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
19740 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19750 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
19760 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
19770 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
19780 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
19790 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
197a0 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
197b0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
197c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
197d0 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
197e0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
197f0 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
19800 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
19810 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
19820 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
19830 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
19840 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
19850 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
19860 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
19870 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
19880 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
19890 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
198a0 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
198b0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
198c0 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
198d0 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
198e0 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
198f0 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
19900 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
19910 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
19920 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
19930 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
19940 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
19950 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
19960 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
19970 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
19980 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
19990 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
199a0 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
199b0 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
199c0 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
199d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
199e0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
199f0 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
19a00 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
19a10 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71  pPg;..  pPg = sq
19a20 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
19a30 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
19a40 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
19a50 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
19a60 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
19a70 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
19a80 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
19a90 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
19aa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
19ab0 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
19ac0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19ae0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
19af0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
19b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
19b10 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
19b20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
19b30 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
19b40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
19b50 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
19b60 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
19b70 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
19b80 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
19b90 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
19ba0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
19bb0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
19bc0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
19bd0 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
19be0 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
19bf0 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
19c00 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
19c10 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
19c20 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
19c30 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
19c40 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
19c50 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
19c60 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
19c70 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
19c80 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
19c90 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
19ca0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
19cb0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
19cc0 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
19cd0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
19ce0 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
19cf0 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
19d00 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
19d10 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
19d20 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
19d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19d40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19d50 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
19d60 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
19d70 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
19d80 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
19d90 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
19da0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
19db0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
19dc0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19de0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
19df0 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e10 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
19e20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
19e30 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
19e40 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
19e50 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
19e60 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
19e70 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
19e80 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
19e90 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
19ea0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
19eb0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
19ec0 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
19ed0 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
19ee0 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
19ef0 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
19f00 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
19f10 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
19f20 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
19f30 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
19f40 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
19f50 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
19f60 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
19f70 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
19f80 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
19f90 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
19fa0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
19fb0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
19fc0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
19fd0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
19fe0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
19ff0 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1a000 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1a010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1a020 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1a030 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1a040 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1a050 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1a060 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1a070 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1a080 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1a090 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a0a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1a0b0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1a0c0 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1a0d0 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1a0e0 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1a0f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1a100 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1a110 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1a120 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1a130 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1a140 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1a150 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1a160 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1a170 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1a180 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2f 20  ** changed. .*/ 
1a190 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a1a0 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1a1b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a1d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1a1e0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1a210 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1a220 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1a250 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1a260 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1a270 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20  ommit,          
1a280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a290 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1a2a0 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 79  mmit */.  int sy
1a2b0 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20 20 20  nc_flags        
1a2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1a2d0 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 4f 73  gs to pass to Os
1a2e0 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20 2a 2f  Sync() (or 0) */
1a2f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1a320 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
1a330 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  t( pPager->pWal 
1a340 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a350 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1a360 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1a370 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a380 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1a390 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79  te, isCommit, sy
1a3a0 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a 20 20  nc_flags.  );.  
1a3b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a3c0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1a3d0 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64  ckup ){.    PgHd
1a3e0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1a3f0 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1a400 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
1a410 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
1a420 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
1a430 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
1a440 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
1a450 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1a470 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1a480 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1a490 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1a4a0 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1a4b0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1a4c0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1a4d0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1a4e0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1a4f0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1a500 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1a510 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1a520 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1a530 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1a540 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1a550 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1a560 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1a570 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1a580 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1a590 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1a5a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a5b0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1a5c0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1a5d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1a5e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a600 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1a610 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a630 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1a640 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1a650 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1a660 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1a670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1a680 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1a690 45 52 5f 4e 4f 4e 45 20 7c 7c 20 70 50 61 67 65  ER_NONE || pPage
1a6a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1a6b0 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
1a6c0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1a6d0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1a6e0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1a6f0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1a700 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1a710 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1a720 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1a730 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1a740 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1a750 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1a760 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1a770 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1a780 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1a790 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1a7a0 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1a7b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1a7c0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1a7d0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1a7e0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1a7f0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1a800 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1a810 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1a820 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a830 45 5f 4f 4b 20 26 26 20 63 68 61 6e 67 65 64 20  E_OK && changed 
1a840 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1a850 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
1a860 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a870 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 44 65  ../*.** TODO: De
1a880 73 63 72 69 70 74 69 6f 6e 20 68 65 72 65 2e 0a  scription here..
1a890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1a8a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1a8b0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1a8c0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1a8d0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8f0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1a900 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1a910 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a920 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1a930 4e 4f 4e 45 20 29 3b 0a 20 20 6e 50 61 67 65 20  NONE );.  nPage 
1a940 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
1a950 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
1a960 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
1a970 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1a980 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a990 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a9a0 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1a9b0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1a9c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a9d0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1a9e0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1a9f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1aa00 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1aa10 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1aa20 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1aa30 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1aa40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1aa50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1aa60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1aa70 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1aa80 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50   = (Pgno)(n / pP
1aa90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1aaa0 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
1aab0 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20  0 && n>0 ){.    
1aac0 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20    nPage = 1;.   
1aad0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1aae0 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1aaf0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1ab00 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1ab10 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
1ab20 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
1ab30 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
1ab40 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
1ab50 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
1ab60 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
1ab70 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
1ab80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1ab90 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
1aba0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1abb0 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
1abc0 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e  Page;.  }..  *pn
1abd0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1abe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1abf0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ;.}.../*.** Chec
1ac00 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
1ac10 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
1ac20 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
1ac30 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
1ac40 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20  Pager.** exists 
1ac50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1ac60 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20  is not empy, or 
1ac70 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1ac80 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  *-wal file does.
1ac90 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79  ** not exist (by
1aca0 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66   deleting it) if
1acb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1acc0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
1acd0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1ace0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  se is not empty 
1acf0 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  and the *-wal fi
1ad00 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20  le exists, open 
1ad10 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20  the pager.** in 
1ad20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68  WAL mode.  If th
1ad30 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
1ad40 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77  pty or if no *-w
1ad50 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
1ad60 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f  nd.** if no erro
1ad70 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73  r occurs, make s
1ad80 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ure Pager.journa
1ad90 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74  lMode is not set
1ada0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   to.** PAGER_JOU
1adb0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a  RNALMODE_WAL..**
1adc0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1add0 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72  E_OK or an error
1ade0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   code..**.** If 
1adf0 74 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73 20  the WAL file is 
1ae00 6f 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70 65  opened, also ope
1ae10 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 28 72 65  n a snapshot (re
1ae20 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  ad transaction).
1ae30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1ae40 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48  r must hold a SH
1ae50 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
1ae60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1ae70 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66  o call this.** f
1ae80 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65  unction. Because
1ae90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1aea0 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  ck on the db fil
1aeb0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  e is required to
1aec0 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41   delete .** a WA
1aed0 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74  L on a none-empt
1aee0 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73  y database, this
1aef0 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69   ensures there i
1af00 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74  s no race condit
1af10 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ion .** between 
1af20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65  the xAccess() be
1af30 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65  low and an xDele
1af40 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75  te() being execu
1af50 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20  ted by some .** 
1af60 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
1af70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af80 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
1af90 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61  esent(Pager *pPa
1afa0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1afb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1afc0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1afd0 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
1afe0 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
1aff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b000 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
1b010 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
1b020 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1b030 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b040 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b050 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73   file */..    as
1b060 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1b070 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
1b080 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b090 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1b0a0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50  HARED_LOCK || pP
1b0b0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
1b0c0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1b0d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1b0e0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1b0f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b100 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
1b110 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
1b120 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1b130 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
1b140 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1b150 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  0);.      isWal 
1b160 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1b170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b180 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
1b190 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
1b1a0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1b1b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1b1c0 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
1b1d0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
1b1e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b1f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1b200 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
1b210 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b220 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1b230 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b240 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1b250 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b260 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1b270 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1b280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b290 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b2a0 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
1b2b0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1b2c0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1b2d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
1b2e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1b2f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
1b300 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
1b310 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b320 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
1b330 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
1b340 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
1b350 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b360 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1b370 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65  ** Playback save
1b380 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74  point pSavepoint
1b390 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f  . Or, if pSavepo
1b3a0 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20  int==NULL, then 
1b3b0 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20  playback.** the 
1b3c0 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
1b3d0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
1b3e0 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d  case pSavepoint=
1b3f0 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65  =NULL occurs whe
1b400 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b  n .** a ROLLBACK
1b410 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69   TO command is i
1b420 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45  nvoked on a SAVE
1b430 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20  POINT that is a 
1b440 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
1b450 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  savepoint..**.**
1b460 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74   When pSavepoint
1b470 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65   is not NULL (me
1b480 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e  aning a non-tran
1b490 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1b4a0 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72  t is .** being r
1b4b0 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65  olled back), the
1b4c0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63  n the rollback c
1b4d0 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f  onsists of up to
1b4e0 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a   three stages,.*
1b4f0 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74  * performed in t
1b500 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69  he order specifi
1b510 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  ed:.**.**   * Pa
1b520 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62  ges are played b
1b530 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
1b540 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
1b550 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20  ng at byte.**   
1b560 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61    offset PagerSa
1b570 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
1b580 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
1b590 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  o .**     PagerS
1b5a0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1b5b0 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65  set, or to the e
1b5c0 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
1b5d0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
1b5e0 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70  le if PagerSavep
1b5f0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
1b600 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20  is zero..**.**  
1b610 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70   * If PagerSavep
1b620 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
1b630 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1b640 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79  n pages are play
1b650 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73  ed.**     back s
1b660 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65  tarting from the
1b670 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b680 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1b690 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61  owing .**     Pa
1b6a0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1b6b0 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65  rOffset to the e
1b6c0 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
1b6d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
1b6e0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
1b6f0 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63   then played bac
1b700 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  k from the sub-j
1b710 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61  ournal file, sta
1b720 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74  rting.**     wit
1b730 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  h the PagerSavep
1b740 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64  oint.iSubRec and
1b750 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
1b760 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20  he end of.**    
1b770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b780 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68  e..**.** Through
1b790 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  out the rollback
1b7a0 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74   process, each t
1b7b0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f  ime a page is ro
1b7c0 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a  lled back, the.*
1b7d0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
1b7e0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20  bit is set in a 
1b7f0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
1b800 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65   (variable pDone
1b810 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65   in the.** imple
1b820 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29  mentation below)
1b830 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
1b840 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20  o ensure that a 
1b850 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  page is only.** 
1b860 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
1b870 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73  first time it is
1b880 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
1b890 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  either journal..
1b8a0 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f  **.** If pSavepo
1b8b0 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  int is NULL, the
1b8c0 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79  n pages are only
1b8d0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
1b8e0 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  m the main.** jo
1b8f0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72  urnal file. Ther
1b900 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
1b910 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69   a bitvec in thi
1b920 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  s case..**.** In
1b930 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65   either case, be
1b940 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f  fore playback co
1b950 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65  mmences the Page
1b960 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  r.dbSize variabl
1b970 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f  e.** is reset to
1b980 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
1b990 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73  it held at the s
1b9a0 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65  tart of the save
1b9b0 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72  point .** (or tr
1b9c0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70  ansaction). No p
1b9d0 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d  age with a page-
1b9e0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
1b9f0 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a  han this value.*
1ba00 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  * is played back
1ba10 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f  . If one is enco
1ba20 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69  untered it is si
1ba30 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  mply skipped..*/
1ba40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1ba50 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
1ba60 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1ba70 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  , PagerSavepoint
1ba80 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20   *pSavepoint){. 
1ba90 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1baa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66            /* Eff
1bab0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
1bac0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1bad0 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
1bae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1baf0 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65   End of first se
1bb00 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f  gment of main-jo
1bb10 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f  urnal records */
1bb20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1bb30 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
1bb40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1bb50 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20  Bitvec *pDone = 
1bb60 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76  0;       /* Bitv
1bb70 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67  ec to ensure pag
1bb80 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  es played back o
1bb90 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61  nly once */..  a
1bba0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1bbb0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1bbc0 54 45 52 5f 49 4e 49 54 49 41 4c 20 29 3b 0a 0a  TER_INITIAL );..
1bbd0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1bbe0 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
1bbf0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
1bc00 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
1bc10 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
1bc20 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
1bc30 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
1bc40 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
1bc50 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
1bc60 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
1bc70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1bc80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1bc90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
1bca0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1bcb0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
1bcc0 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
1bcd0 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
1bce0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
1bcf0 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
1bd00 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1bd10 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
1bd20 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
1bd30 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
1bd40 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1bd50 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1bd60 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1bd70 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1bd80 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
1bd90 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
1bda0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
1bdb0 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
1bdc0 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  kWal(pPager);.  
1bdd0 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
1bde0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
1bdf0 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1be00 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
1be10 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
1be20 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
1be30 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
1be40 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1be50 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
1be60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
1be70 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
1be80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1be90 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
1bea0 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
1beb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
1bec0 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
1bed0 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
1bee0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bef0 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
1bf00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1bf10 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
1bf20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
1bf30 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
1bf40 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
1bf50 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
1bf60 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
1bf70 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
1bf80 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
1bf90 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
1bfa0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
1bfb0 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
1bfc0 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
1bfd0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1bfe0 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
1bff0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
1c000 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
1c010 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
1c020 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
1c030 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
1c040 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
1c050 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
1c060 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
1c070 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
1c080 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
1c090 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
1c0a0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
1c0b0 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
1c0c0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c0d0 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
1c0e0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
1c0f0 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
1c100 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
1c110 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1c120 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
1c130 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
1c140 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1c150 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
1c160 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
1c170 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
1c180 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1c190 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1c1a0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
1c1b0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
1c1c0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
1c1d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1c1e0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
1c1f0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
1c200 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1c210 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
1c220 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
1c230 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
1c240 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1c250 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
1c260 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
1c270 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
1c280 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
1c290 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
1c2a0 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
1c2b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1c2c0 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
1c2d0 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
1c2e0 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
1c2f0 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
1c300 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
1c310 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
1c320 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
1c330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1c340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c350 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
1c360 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
1c370 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1c380 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
1c390 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
1c3a0 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
1c3b0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
1c3c0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
1c3d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1c3e0 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
1c3f0 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
1c400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1c410 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1c420 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1c430 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
1c440 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
1c450 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
1c460 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c470 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
1c480 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
1c490 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
1c4a0 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
1c4b0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
1c4c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
1c4d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
1c4e0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1c4f0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1c500 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
1c510 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
1c520 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
1c530 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
1c540 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c550 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
1c560 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
1c570 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
1c580 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
1c590 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1c5a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1c5b0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1c5c0 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
1c5d0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1c5e0 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
1c5f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1c600 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1c610 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
1c620 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c630 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
1c640 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1c650 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
1c660 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
1c670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c680 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1c690 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff>=szJ );.. 
1c6a0 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
1c6b0 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
1c6c0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
1c6d0 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
1c6e0 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
1c6f0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
1c700 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
1c710 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
1c720 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
1c730 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
1c740 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
1c750 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
1c760 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
1c770 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
1c780 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
1c790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1c7a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1c7b0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1c7c0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
1c7d0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
1c7e0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
1c7f0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
1c800 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1c810 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
1c820 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
1c830 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
1c840 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
1c850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1c860 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
1c870 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
1c880 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
1c890 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
1c8a0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
1c8b0 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b  ( offset==ii*(4+
1c8c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c8d0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
1c8e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1c8f0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
1c900 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
1c910 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
1c920 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1c930 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
1c940 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
1c950 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
1c960 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c970 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
1c980 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1c990 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
1c9a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c9b0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
1c9c0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
1c9d0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
1c9e0 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
1c9f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1ca00 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
1ca10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1ca20 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
1ca30 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
1ca40 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
1ca50 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
1ca60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
1ca70 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
1ca80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ca90 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
1caa0 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
1cab0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
1cac0 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
1cad0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
1cae0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
1caf0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
1cb00 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
1cb10 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
1cb20 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
1cb30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
1cb40 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
1cb50 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
1cb60 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1cb80 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
1cb90 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
1cba0 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
1cbb0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
1cbc0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
1cbd0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
1cbe0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
1cbf0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
1cc00 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
1cc10 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
1cc20 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
1cc40 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
1cc50 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
1cc60 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
1cc70 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
1cc80 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
1cc90 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
1cca0 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
1ccb0 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
1ccc0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
1ccd0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
1cce0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
1ccf0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
1cd00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
1cd10 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
1cd20 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
1cd30 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
1cd40 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
1cd50 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
1cd60 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
1cd70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1cd80 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
1cd90 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
1cda0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
1cdb0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1cdd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1cde0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
1cdf0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
1ce00 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
1ce10 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
1ce20 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
1ce30 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
1ce40 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
1ce50 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
1ce60 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
1ce70 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
1ce80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ce90 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
1cea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
1ceb0 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
1cec0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
1ced0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
1cee0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
1cef0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1cf00 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
1cf10 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
1cf20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
1cf30 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
1cf40 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
1cf50 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
1cf60 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
1cf70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cf80 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
1cf90 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
1cfa0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
1cfb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1cfc0 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c   level, int bFul
1cfd0 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  lFsync){.  pPage
1cfe0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
1cff0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
1d000 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
1d010 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
1d020 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
1d030 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
1d040 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
1d050 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1d060 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f  s = (bFullFsync?
1d070 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1d080 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  :SQLITE_SYNC_NOR
1d090 4d 41 4c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  MAL);.}.#endif..
1d0a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1d0b0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
1d0c0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
1d0d0 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
1d0e0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
1d0f0 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
1d100 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
1d110 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1d120 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
1d130 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
1d140 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
1d150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1d160 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
1d170 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
1d180 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1d190 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
1d1a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
1d1b0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
1d1c0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
1d1d0 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
1d1e0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1d1f0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
1d200 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
1d210 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
1d220 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
1d230 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
1d240 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
1d250 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
1d260 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
1d270 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
1d280 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
1d290 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
1d2a0 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
1d2b0 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
1d2c0 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
1d2d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1d2e0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
1d2f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
1d300 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
1d310 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
1d320 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1d330 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
1d340 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1d350 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
1d360 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
1d370 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
1d380 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
1d390 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1d3a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1d3b0 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
1d3c0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
1d3d0 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
1d3e0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
1d3f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1d400 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
1d410 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
1d420 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1d430 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d440 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
1d450 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1d460 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
1d470 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
1d480 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
1d490 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
1d4a0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
1d4b0 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
1d4c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1d4d0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1d4e0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
1d4f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1d500 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
1d510 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1d520 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
1d530 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
1d540 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
1d550 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
1d560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
1d570 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
1d580 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
1d590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d5a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
1d5b0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
1d5c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
1d5d0 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
1d5e0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
1d5f0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
1d600 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
1d610 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
1d620 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
1d630 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
1d640 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
1d650 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
1d660 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
1d670 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1d680 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
1d690 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
1d6a0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
1d6b0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1d6c0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
1d6d0 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
1d6e0 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
1d6f0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
1d700 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
1d710 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
1d720 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
1d730 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1d740 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
1d750 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
1d780 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
1d790 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
1d7a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d7b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d7c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1d7d0 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
1d7e0 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
1d7f0 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
1d800 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
1d810 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
1d820 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
1d830 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
1d840 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
1d850 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
1d860 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
1d870 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
1d880 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
1d890 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
1d8a0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
1d8b0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
1d8c0 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
1d8d0 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
1d8e0 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
1d8f0 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
1d900 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
1d910 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
1d920 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
1d930 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1d940 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
1d950 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
1d960 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d980 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1d990 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
1d9a0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
1d9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d9c0 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
1d9d0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
1d9e0 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
1d9f0 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
1da00 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
1da10 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
1da20 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
1da30 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
1da40 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
1da50 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
1da60 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1da70 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
1da80 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
1da90 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
1daa0 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
1dab0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
1dac0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
1dad0 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
1dae0 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
1daf0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1db00 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
1db10 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
1db20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1db30 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
1db40 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
1db50 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
1db60 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
1db70 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
1db80 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
1db90 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
1dba0 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f  RRUPT or SQLITE_
1dbb0 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
1dbc0 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
1dbd0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1dbe0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1dbf0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
1dc00 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
1dc10 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
1dc20 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
1dc30 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
1dc40 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
1dc50 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
1dc60 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
1dc70 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
1dc80 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
1dc90 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
1dca0 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
1dcb0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
1dcc0 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
1dcd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1dce0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
1dcf0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
1dd00 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
1dd10 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
1dd20 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
1dd30 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
1dd40 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
1dd50 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
1dd60 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
1dd70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1dd80 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
1dd90 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1dda0 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
1ddb0 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
1ddc0 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
1ddd0 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
1dde0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
1ddf0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
1de00 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
1de10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
1de20 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1de30 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
1de40 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
1de50 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
1de60 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
1de70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1de80 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
1de90 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
1dea0 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
1deb0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
1dec0 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
1ded0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
1dee0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
1def0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
1df00 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
1df10 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
1df20 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
1df30 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
1df40 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1df50 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
1df60 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
1df70 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
1df80 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
1df90 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
1dfa0 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
1dfb0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
1dfc0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
1dfd0 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53  ger, u16 *pPageS
1dfe0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
1dff0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  e){.  int rc = p
1e000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1e010 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  E_OK ){.    u16 
1e030 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
1e040 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
1e050 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
1e060 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
1e070 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
1e080 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
1e090 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ZE) );.    if( (
1e0a0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
1e0b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
1e0c0 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73  ze==0).     && s
1e0d0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
1e0e0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
1e0f0 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 20 26  ache)==0 .     &
1e100 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
1e110 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
1e120 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 29 7b  pageSize .    ){
1e130 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65  .      char *pNe
1e140 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
1e150 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
1e160 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  pace */.      i6
1e170 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20  4 nByte = 0;.   
1e180 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
1e190 53 74 61 74 65 3e 50 41 47 45 52 5f 4e 4f 4e 45  State>PAGER_NONE
1e1a0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
1e1b0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
1e1c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e1d0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1e1e0 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
1e1f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e200 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1e210 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1e220 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
1e230 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
1e240 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
1e250 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
1e260 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1e270 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1e280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e2a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1e2b0 4e 4f 4e 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e  NONE || pPager->
1e2c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
1e2d0 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  ADER );.        
1e2e0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1e2f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
1e300 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 42  ger->dbSize = nB
1e310 79 74 65 2f 70 61 67 65 53 69 7a 65 3b 0a 20 20  yte/pageSize;.  
1e320 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1e330 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1e340 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1e350 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1e360 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1e370 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1e380 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1e390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e3a0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1e3b0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1e3c0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1e3d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e3e0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1e3f0 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1e400 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1e410 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1e420 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1e430 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1e440 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1e450 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1e460 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1e470 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1e480 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1e490 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1e4a0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1e4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1e4c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1e4d0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1e4e0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1e4f0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1e500 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1e510 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1e520 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1e530 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1e540 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1e550 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1e560 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1e570 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1e580 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1e590 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1e5a0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1e5b0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1e5c0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1e5d0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1e5e0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1e5f0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1e600 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1e610 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1e620 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1e630 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1e640 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1e650 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1e660 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1e670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1e680 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1e690 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1e6a0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1e6b0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1e6c0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1e6d0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1e6e0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1e6f0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1e700 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1e710 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1e720 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1e730 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e740 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1e750 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1e760 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1e770 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1e780 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1e790 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1e7a0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1e7b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1e7c0 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
1e7d0 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
1e7e0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
1e7f0 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  age;.  }.  if( p
1e800 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1e810 41 47 45 52 5f 4e 4f 4e 45 20 26 26 20 70 50 61  AGER_NONE && pPa
1e820 67 65 72 2d 3e 6d 78 50 67 6e 6f 3c 70 50 61 67  ger->mxPgno<pPag
1e830 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
1e840 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
1e850 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1e860 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
1e870 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
1e880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1e890 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
1e8a0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
1e8b0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
1e8c0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
1e8d0 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
1e8e0 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
1e8f0 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
1e900 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
1e910 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
1e920 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
1e930 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
1e940 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
1e950 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
1e960 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
1e970 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
1e980 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
1e990 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
1e9a0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1e9b0 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
1e9c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
1e9d0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
1e9e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
1e9f0 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
1ea00 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
1ea10 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
1ea20 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1ea30 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
1ea40 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
1ea50 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
1ea60 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
1ea70 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
1ea80 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
1ea90 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1eaa0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
1eab0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1eac0 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
1ead0 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
1eae0 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
1eaf0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1eb00 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
1eb10 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1eb20 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
1eb30 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1eb40 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
1eb50 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
1eb60 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
1eb70 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
1eb80 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
1eb90 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
1eba0 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
1ebb0 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
1ebc0 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
1ebd0 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
1ebe0 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
1ebf0 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
1ec00 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
1ec10 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
1ec20 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
1ec30 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1ec40 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
1ec50 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
1ec60 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1ec70 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1ec80 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
1ec90 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
1eca0 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
1ecb0 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
1ecc0 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
1ecd0 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
1ece0 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
1ecf0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
1ed00 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
1ed10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1ed20 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
1ed30 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
1ed40 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1ed50 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1ed60 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
1ed70 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
1ed80 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
1ed90 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
1eda0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
1edb0 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
1edc0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
1edd0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ede0 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
1edf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ee00 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
1ee10 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
1ee20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1ee30 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1ee40 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54  pFile );..  /* T
1ee50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
1ee60 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74  nly called by bt
1ee70 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ree immediately 
1ee80 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20  after creating. 
1ee90 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62   ** the Pager ob
1eea0 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73  ject.  There has
1eeb0 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70   not been an opp
1eec0 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e  ortunity to tran
1eed0 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57  sition.  ** to W
1eee0 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a  AL mode yet..  *
1eef0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
1ef00 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1ef10 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65   );..  if( isOpe
1ef20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1ef30 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
1ef40 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
1ef50 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
1ef60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1ef70 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1ef80 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
1ef90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1efa0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1efb0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1efc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1efd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1efe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1eff0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
1f000 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
1f010 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1f020 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a  ion is open on.*
1f030 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  * the pager. It 
1f040 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
1f050 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1f060 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1f070 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72  e..**.** However
1f080 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
1f090 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
1f0a0 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
1f0b0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
1f0c0 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
1f0d0 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
1f0e0 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ile..*/.int sqli
1f0f0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1f100 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1f110 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
1f120 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f130 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  >eState>=PAGER_S
1f140 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
1f150 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1f160 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
1f170 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
1f180 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
1f190 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 72  ger->dbSize;.  r
1f1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f1b0 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .}...static int 
1f1c0 70 61 67 65 72 4c 6f 63 6b 28 50 61 67 65 72 20  pagerLock(Pager 
1f1d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f  *pPager, int eLo
1f1e0 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ck){.  int rc;. 
1f1f0 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
1f200 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
1f210 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
1f220 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
1f230 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1f240 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
1f250 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock>=eLock ){.  
1f260 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f270 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1f280 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1f290 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
1f2a0 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
1f2b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f2c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
1f2d0 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 20 20  ck = eLock;.    
1f2e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1f2f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  c;.}../*.** Try 
1f300 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
1f310 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
1f320 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
1f330 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
1f340 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
1f350 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
1f360 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
1f370 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1f380 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
1f390 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
1f3a0 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
1f3b0 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
1f3c0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
1f3d0 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
1f3e0 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
1f3f0 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
1f400 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
1f410 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
1f420 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1f430 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
1f440 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1f450 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
1f460 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
1f470 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
1f480 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
1f490 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
1f4a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1f4b0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
1f4c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
1f4d0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
1f4e0 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
1f4f0 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
1f500 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
1f510 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
1f520 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
1f530 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
1f540 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1f550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f560 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1f570 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1f580 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
1f590 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f5c0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
1f5d0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
1f5e0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
1f5f0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
1f600 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
1f610 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
1f620 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
1f630 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1f640 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
1f650 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
1f660 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
1f670 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
1f680 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
1f690 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1f6a0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
1f6b0 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
1f6c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
1f6d0 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
1f6e0 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20  dy held, or one 
1f6f0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69  of the transisti
1f700 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
1f710 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
1f720 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
1f730 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
1f740 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
1f750 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
1f760 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
1f770 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
1f780 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
1f790 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
1f7a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
1f7b0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
1f7c0 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
1f7d0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
1f7e0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1f7f0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
1f800 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
1f810 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1f820 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ).  );..  if( pP
1f830 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
1f840 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
1f850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1f860 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
1f870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f880 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
1f890 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
1f8a0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
1f8b0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
1f8c0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
1f8d0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
1f8e0 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
1f8f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
1f910 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
1f920 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  8)locktype;.    
1f930 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
1f940 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1f950 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
1f960 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1f970 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
1f980 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
1f990 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1f9a0 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
1f9b0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
1f9c0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
1f9d0 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
1f9e0 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
1f9f0 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
1fa00 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
1fa10 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1fa20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1fa30 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
1fa40 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
1fa50 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
1fa60 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
1fa70 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
1fa80 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
1fa90 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
1faa0 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
1fab0 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
1fac0 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
1fad0 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
1fae0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
1faf0 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
1fb00 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
1fb10 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
1fb20 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
1fb30 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
1fb40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
1fb50 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
1fb60 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1fb70 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
1fb80 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
1fb90 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
1fba0 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
1fbb0 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
1fbc0 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
1fbd0 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
1fbe0 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
1fbf0 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
1fc00 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
1fc10 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
1fc20 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
1fc30 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
1fc40 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
1fc50 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
1fc60 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
1fc70 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
1fc80 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74  viour would be t
1fc90 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
1fca0 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74  rrent.** content
1fcb0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f   of the page. Ho
1fcc0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69  wever, since thi
1fcd0 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
1fce0 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68   present in eith
1fcf0 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  er.** the databa
1fd00 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  se file or the p
1fd10 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  ortion of the ro
1fd20 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1fd30 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  nd .** sub-journ
1fd40 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  al rolled back t
1fd50 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64  he content could
1fd60 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64   not be restored
1fd70 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
1fd80 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64  base image would
1fd90 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1fda0 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65   It is therefore
1fdb0 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20   fortunate that 
1fdc0 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73  .** this circums
1fdd0 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69  tance cannot ari
1fde0 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  se..*/.#if defin
1fdf0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1fe00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
1fe10 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1fe20 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70  raintCb(PgHdr *p
1fe30 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
1fe40 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1fe50 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72  DIRTY );.  asser
1fe60 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  t( !subjRequires
1fe70 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67  Page(pPg) || pPg
1fe80 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61  ->pgno<=pPg->pPa
1fe90 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d  ger->dbSize );.}
1fea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
1feb0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1fec0 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  raint(Pager *pPa
1fed0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
1fee0 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
1fef0 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
1ff00 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  e, assertTruncat
1ff10 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a  eConstraintCb);.
1ff20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1ff30 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1ff40 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
1ff50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1ff60 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
1ff70 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1ff80 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
1ff90 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
1ffa0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
1ffb0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
1ffc0 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
1ffd0 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
1ffe0 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
1fff0 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
20000 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
20010 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
20020 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
20030 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
20040 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
20050 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
20060 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76   committed..*/.v
20070 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20080 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
20090 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
200a0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
200b0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
200c0 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61  ze>=nPage );.  a
200d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
200e0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
200f0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
20100 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20110 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65   = nPage;.  asse
20120 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
20130 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  aint(pPager);.}.
20140 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20150 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20160 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
20170 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
20180 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
20190 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
201a0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
201b0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
201c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
201d0 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
201e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
201f0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
20200 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
20210 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
20220 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
20230 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
20240 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
20250 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
20260 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
20270 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
20280 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
20290 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
202a0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
202b0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
202c0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
202d0 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
202e0 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
202f0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
20300 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
20310 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
20320 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
20330 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
20340 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
20350 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
20360 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
20370 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
20380 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
20390 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
203a0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
203b0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
203c0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
203d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
203e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
203f0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
20400 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
20410 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
20420 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
20430 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
20440 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
20450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
20460 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
20470 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
20480 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
20490 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
204a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
204b0 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
204c0 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
204d0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
204e0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
204f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
20500 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
20510 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
20520 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
20530 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
20540 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
20550 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
20560 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
20570 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
20580 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
20590 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
205a0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
205b0 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
205c0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
205d0 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
205e0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
205f0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
20600 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
20610 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
20620 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20630 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
20640 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
20650 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
20660 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
20670 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
20680 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
20690 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
206a0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
206b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
206c0 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
206d0 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
206e0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
206f0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
20700 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
20710 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
20720 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20730 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
20740 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
20750 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f  ace;..  disable_
20760 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
20770 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
20780 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
20790 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  c();.  pPager->e
207a0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
207b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
207c0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
207d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
207e0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f  .  sqlite3WalClo
207f0 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
20800 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f  .    (pPager->no
20810 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65  Sync ? 0 : pPage
20820 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20  r->sync_flags), 
20830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
20840 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b  eSize, pTmp.  );
20850 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
20860 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
20870 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
20880 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
20890 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
208a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
208b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  lse{.    /* Set 
208c0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72  Pager.journalHdr
208d0 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62   to -1 for the b
208e0 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61  enefit of the pa
208f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a  ger_playback() .
20900 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63      ** call whic
20910 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72  h may be made fr
20920 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55  om within pagerU
20930 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
20940 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a  (). If it.    **
20950 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e   is not -1, then
20960 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f   the unsynced po
20970 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e  rtion of an open
20980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
20990 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79  y.    ** be play
209a0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
209b0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
209c0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
209d0 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a  curs while.    *
209e0 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
209f0 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
20a00 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72  e may become cor
20a10 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rupt..    */.   
20a20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
20a30 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
20a40 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
20a50 65 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  e = pagerSyncHot
20a60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
20a70 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
20a80 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
20a90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
20aa0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
20ab0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
20ac0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
20ad0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
20ae0 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
20af0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
20b00 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
20b10 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
20b20 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
20b30 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
20b40 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
20b50 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
20b60 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
20b70 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
20b80 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
20b90 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
20ba0 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
20bb0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
20bc0 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
20bd0 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
20be0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
20bf0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
20c00 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
20c10 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
20c20 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
20c30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
20c40 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
20c50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
20c60 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
20c70 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
20c80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
20c90 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
20ca0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
20cb0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
20cc0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
20cd0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
20ce0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
20cf0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
20d00 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
20d10 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
20d20 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
20d30 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
20d40 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
20d50 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
20d60 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
20d70 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
20d80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20d90 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
20da0 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
20db0 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
20dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
20dd0 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
20de0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
20df0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
20e00 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
20e10 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
20e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
20e30 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
20e40 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
20e50 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
20e60 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
20e70 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
20e80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
20e90 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
20ea0 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
20eb0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
20ec0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
20ed0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
20ee0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
20ef0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
20f00 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
20f10 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
20f20 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
20f30 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
20f40 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
20f50 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
20f60 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
20f70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20f80 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
20f90 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
20fa0 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
20fb0 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
20fc0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
20fd0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
20fe0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
20ff0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
21000 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
21010 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
21020 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
21030 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
21040 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
21050 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
21060 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
21070 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
21080 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
21090 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
210a0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
210b0 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
210c0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
210d0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
210e0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
210f0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
21100 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
21110 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
21120 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
21130 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
21140 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
21150 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
21160 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
21170 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
21180 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
21190 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
211a0 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
211b0 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
211c0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
211d0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
211e0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
211f0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
21200 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
21210 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
21220 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
21230 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
21240 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
21250 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
21260 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
21270 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
21280 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
21290 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
212a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
212b0 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
212c0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
212d0 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
212e0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
212f0 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
21300 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
21310 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
21320 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
21330 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
21340 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
21350 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
21360 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
21370 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
21380 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
21390 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20  , int newHdr){. 
213a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
213d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
213e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
213f0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
21400 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
21410 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
21420 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
21430 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
21440 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
21450 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
21460 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
21470 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
21480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
21490 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
214a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
214b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
214c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
214d0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
214e0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
214f0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
21500 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
21510 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
21520 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
21530 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
21540 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
21550 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ORY ){.      con
21560 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
21570 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
21580 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
21590 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
215a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
215b0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
215c0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
215d0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
215e0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
215f0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
21600 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
21610 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
21620 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
21630 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
21640 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
21650 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
21660 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
21670 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
21680 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
21690 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
216a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
216b0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
216c0 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
216d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
216e0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
216f0 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
21700 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
21710 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
21720 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
21730 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
21740 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
21750 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
21760 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
21770 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ious connection'
21780 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
21790 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
217a0 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
217b0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
217c0 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
217d0 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
217e0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
217f0 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
21800 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
21810 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
21820 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
21830 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
21840 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
21850 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
21860 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
21870 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
21880 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
21890 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
218a0 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
218b0 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
218c0 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
218d0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
218e0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
218f0 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
21900 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
21910 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
21920 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
21930 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
21940 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
21950 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
21960 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
21970 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
21980 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
21990 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
219a0 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
219b0 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
219c0 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
219d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
219e0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
219f0 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
21a00 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
21a10 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
21a20 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
21a30 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
21a40 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
21a50 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
21a60 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
21a70 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
21a80 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
21a90 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
21aa0 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
21ab0 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
21ac0 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
21ad0 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
21ae0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
21af0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
21b00 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
21b10 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
21b20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
21b30 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
21b40 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
21b50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
21b60 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
21b70 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
21b80 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
21b90 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65         u8 zHeade
21ba0 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
21bb0 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20  lMagic)+4];..   
21bc0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61       memcpy(zHea
21bd0 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
21be0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
21bf0 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
21c00 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
21c10 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
21c20 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
21c30 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
21c40 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
21c50 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
21c60 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
21c70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
21c80 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
21c90 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
21ca0 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
21cb0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
21cc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21cd0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
21ce0 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
21cf0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
21d00 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
21d10 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
21d20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21d30 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
21d40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
21d50 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
21d60 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
21d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21d90 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
21da0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
21db0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
21dc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
21dd0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
21de0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
21df0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
21e00 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
21e10 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
21e20 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
21e30 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
21e40 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
21e50 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
21e60 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
21e70 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
21e80 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
21e90 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
21ea0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
21eb0 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
21ec0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
21ed0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
21ee0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
21ef0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
21f00 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
21f10 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
21f20 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
21f30 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
21f40 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
21f50 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
21f60 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
21f70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
21f80 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
21f90 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
21fa0 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
21fb0 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
21fc0 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
21fd0 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
21fe0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
21ff0 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
22000 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
22010 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
22020 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
22030 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22040 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
22050 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
22060 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
22070 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
22080 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
22090 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
220a0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
220b0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
220c0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
220d0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
220e0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
220f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22100 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
22110 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
22120 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
22130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22140 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
22150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22160 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
22170 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
22180 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
22190 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
221a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
221b0 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
221c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
221d0 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
221e0 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
221f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
22200 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
22210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22220 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
22230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22240 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
22250 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
22260 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
22270 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
22280 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
22290 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
222a0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
222b0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
222c0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
222d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
222e0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
222f0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
22300 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
22310 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
22320 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
22330 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
22340 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
22350 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
22360 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22370 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
22380 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
22390 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
223a0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
223b0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
223c0 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
223d0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
223e0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
223f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
22400 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
22410 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22420 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
22430 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
22440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
22450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22460 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
22470 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
22480 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
22490 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
224a0 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
224b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
224c0 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
224d0 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
224e0 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
224f0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
22500 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
22510 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
22520 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
22530 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
22540 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
22550 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
22560 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
22570 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
22580 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
22590 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
225a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
225b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
225c0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
225d0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
225e0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
225f0 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
22600 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
22610 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
22620 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
22630 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
22640 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
22650 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
22660 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
22670 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
22680 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
22690 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
226a0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
226b0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
226c0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
226d0 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
226e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
226f0 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
22700 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
22710 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
22720 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
22730 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
22740 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
22750 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22760 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
22770 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
22780 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
22790 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
227a0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
227b0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
227c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
227d0 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
227e0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
227f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
22800 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22810 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
22820 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
22830 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
22840 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
22850 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
22860 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
22870 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
22880 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
22890 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
228a0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
228b0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
228c0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
228d0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
228e0 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
228f0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
22900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22910 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
22920 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
22930 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
22940 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
22950 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
22960 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
22970 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
22980 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
22990 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
229a0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
229b0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
229c0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
229d0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
229e0 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
229f0 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
22a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
22a10 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
22a20 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
22a30 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
22a40 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
22a50 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
22a60 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
22a70 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
22a80 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
22a90 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
22aa0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
22ab0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
22ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22ad0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
22ae0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
22af0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
22b00 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
22b10 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
22b20 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
22b30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
22b40 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
22b50 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
22b60 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
22b70 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
22b80 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
22b90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
22ba0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
22bb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
22bc0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
22bd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22c00 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74  de */..  /* At t
22c10 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
22c20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
22c30 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
22c40 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
22c50 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
22c60 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
22c70 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
22c80 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
22c90 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
22ca0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
22cb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
22cc0 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
22cd0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
22ce0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
22cf0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
22d00 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
22d10 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
22d20 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
22d30 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
22d40 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
22d50 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
22d60 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
22d70 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
22d80 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
22d90 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
22da0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
22db0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
22dc0 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
22dd0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
22de0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
22df0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
22e00 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
22e10 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
22e20 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
22e30 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
22e40 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
22e50 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
22e60 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
22e70 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
22e80 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
22e90 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
22ea0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
22eb0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
22ec0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
22ed0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
22ee0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
22ef0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
22f00 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
22f10 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
22f20 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
22f30 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
22f40 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
22f50 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
22f60 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  .  */..  /* Norm
22f70 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
22f80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6e  ion is called in
22f90 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
22fa0 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  ate..  **.  ** H
22fb0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
22fc0 20 63 61 6c 6c 65 64 20 69 6e 20 57 52 49 54 45   called in WRITE
22fd0 52 5f 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  R_CACHEMOD state
22fe0 20 69 66 20 74 68 65 20 70 61 67 65 20 62 65 69   if the page bei
22ff0 6e 67 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  ng.  ** written 
23000 28 61 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70  (and all other p
23010 61 67 65 73 20 74 68 61 74 20 72 65 73 69 64 65  ages that reside
23020 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73   on the same dis
23030 6b 20 73 65 63 74 6f 72 29 20 77 61 73 0a 20 20  k sector) was.  
23040 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ** a free-list l
23050 65 61 66 20 70 61 67 65 20 61 74 20 74 68 65 20  eaf page at the 
23060 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
23070 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 61  nsaction. In tha
23080 74 20 63 61 73 65 0a 20 20 2a 2a 20 74 68 65 20  t case.  ** the 
23090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
230a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 69 6e   not really bein
230b0 67 20 6d 6f 64 69 66 69 65 64 2c 20 73 6f 20 69  g modified, so i
230c0 74 20 69 73 20 4f 6b 20 74 6f 20 77 72 69 74 65  t is Ok to write
230d0 0a 20 20 2a 2a 20 74 6f 20 69 74 20 69 6e 20 43  .  ** to it in C
230e0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2e 0a 20  ACHEMOD state.. 
230f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
23100 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
23110 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23120 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
23130 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
23140 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
23150 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
23160 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
23170 4f 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  OD .  );.  asser
23180 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
23190 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
231a0 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c  DBMOD .       ||
231b0 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d   (pList->pDirty=
231c0 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 70 67 6e  =0 && pList->pgn
231d0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  o<=pPager->dbFil
231e0 65 53 69 7a 65 29 0a 20 20 29 3b 0a 0a 20 20 72  eSize).  );..  r
231f0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
23200 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
23210 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
23220 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
23230 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
23240 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23250 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
23260 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
23270 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
23280 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
23290 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
232a0 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
232b0 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
232c0 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
232d0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
232e0 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
232f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
23300 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23310 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23320 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
23330 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
23340 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
23350 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
23360 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
23370 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
23380 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
23390 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
233a0 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
233b0 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
233c0 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
233d0 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
233e0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
233f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23400 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
23410 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
23420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23430 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70  pPager->dbSize>p
23440 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
23450 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
23460 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
23470 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23480 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
23490 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
234a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
234b0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
234c0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
234d0 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
234e0 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  szFile);.  }..  
234f0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
23500 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
23510 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
23520 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
23530 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
23540 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
23550 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
23560 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
23570 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
23580 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
23590 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
235a0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
235b0 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
235c0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
235d0 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
235e0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
235f0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
23600 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
23610 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
23620 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
23630 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
23640 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
23650 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
23660 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
23670 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
23680 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
23690 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
236a0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
236b0 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
236c0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
236d0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
236e0 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
236f0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
23700 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
23710 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
23720 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
23730 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
23740 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
23750 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
23760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
23790 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
237a0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
237b0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
237c0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
237d0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
237e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
237f0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
23800 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
23810 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
23820 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
23830 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
23840 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
23850 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
23860 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23870 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
23880 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
23890 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
238a0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
238b0 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
238c0 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
238d0 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
238e0 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
238f0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
23900 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
23910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23920 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
23930 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
23940 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
23950 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
23960 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
23970 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
23980 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
23990 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
239a0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
239b0 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
239c0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
239d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
239e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
239f0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
23a00 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
23a10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23a20 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
23a30 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
23a40 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
23a50 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
23a60 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
23a70 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
23a80 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
23a90 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
23aa0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
23ab0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
23ac0 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
23ad0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
23ae0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
23af0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
23b20 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
23b30 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
23b40 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
23b50 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
23b60 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
23b70 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
23b80 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
23b90 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
23ba0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
23bb0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
23bc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23bd0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
23be0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
23bf0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
23c00 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
23c10 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
23c20 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
23c30 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
23c40 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
23c50 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
23c60 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
23c70 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
23c80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
23c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
23ca0 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
23cb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
23cc0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
23cd0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
23ce0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
23cf0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
23d00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
23d10 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
23d20 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
23d30 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
23d40 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
23d50 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
23d60 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
23d70 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
23d80 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
23d90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
23da0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
23db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23dc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23dd0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
23de0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
23df0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
23e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
23e10 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
23e20 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
23e30 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
23e40 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
23e50 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
23e60 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
23e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23e80 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
23e90 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
23ea0 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
23eb0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
23ec0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
23ed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23ee0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
23ef0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
23f00 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
23f10 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
23f20 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
23f30 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
23f40 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
23f50 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
23f60 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
23f70 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
23f80 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
23f90 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
23fa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
23fb0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
23fc0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
23fd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
23fe0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
23ff0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
24000 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
24010 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
24020 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
24030 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
24040 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
24050 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
24060 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
24070 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
24080 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
24090 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
240a0 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
240b0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
240c0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
240d0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
240e0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
240f0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
24100 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
24110 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
24120 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
24130 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24140 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
24150 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
24160 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
24170 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
24180 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
24190 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
241a0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
241b0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
241c0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
241d0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
241e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
241f0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
24200 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
24210 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
24220 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
24230 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
24240 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24250 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
24260 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
24270 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
24280 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
24290 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
242a0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
242b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
242c0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
242d0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
242e0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
242f0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
24300 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
24310 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
24320 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
24330 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
24340 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
24350 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
24360 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
24370 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
24380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
243a0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
243b0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
243c0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
243d0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
243e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
243f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
24400 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
24410 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
24420 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
24430 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
24440 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
24450 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
24460 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
24470 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
24480 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
24490 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
244a0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
244b0 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
244c0 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
244d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
244e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
244f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24500 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
24510 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
24520 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
24530 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
24540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24550 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
24560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
24570 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
24580 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
24590 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
245a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
245b0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
245c0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
245d0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
245e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
245f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24600 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
24610 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
24620 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
24630 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
24640 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
24650 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
24660 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
24670 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
24680 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
24690 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
246a0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
246b0 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
246c0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
246d0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
246e0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
246f0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
24700 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
24710 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
24720 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
24730 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
24740 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
24750 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
24760 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
24770 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
24780 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
24790 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
247a0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
247b0 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
247c0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
247d0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
247e0 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
247f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24800 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
24810 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
24820 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
24830 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
24840 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
24850 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
24860 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
24870 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
24880 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
24890 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
248a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
248b0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
248c0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
248d0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
248e0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
248f0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
24900 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
24910 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
24920 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
24930 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
24940 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
24950 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
24960 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
24970 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
24980 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
24990 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
249a0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
249b0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
249c0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
249d0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
249e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
249f0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
24a00 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
24a10 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
24a20 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
24a30 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
24a40 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
24a50 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
24a60 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
24a70 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
24a80 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
24a90 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
24aa0 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
24ab0 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
24ac0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
24ad0 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
24ae0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24af0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
24b00 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
24b10 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
24b20 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
24b30 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
24b40 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
24b50 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
24b60 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
24b70 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
24b80 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
24b90 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
24ba0 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
24bb0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
24bc0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
24bd0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
24be0 20 61 6c 73 6f 20 69 6e 68 69 62 69 74 65 64 20   also inhibited 
24bf0 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
24c00 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
24c10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
24c20 64 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  de ) return SQLI
24c30 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
24c40 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
24c50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24c60 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
24c70 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
24c80 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   && (pPg->flags 
24c90 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
24ca0 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  C)!=0 ){.    ret
24cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24cc0 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
24cd0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
24ce0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
24cf0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
24d00 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
24d10 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
24d20 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
24d30 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
24d40 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
24d50 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
24d60 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
24d70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
24d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24d90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
24da0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
24db0 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
24dc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
24dd0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
24de0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
24df0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
24e00 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
24e10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
24e20 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  C ){.      rc = 
24e30 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
24e40 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
24e50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
24e60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
24e70 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
24e80 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
24e90 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a  nt size of.    *
24ea0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
24eb0 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65  mage, it may nee
24ec0 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  d to be written 
24ed0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
24ee0 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  al..    ** This 
24ef0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
24f00 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
24f10 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
24f20 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
24f30 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
24f40 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
24f50 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
24f60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
24f70 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
24f80 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
24f90 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a  of events:.    *
24fa0 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e  *.    **   BEGIN
24fb0 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  ;.    **     <jo
24fc0 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
24fd0 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79    **     <modify
24fe0 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
24ff0 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
25000 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c  ;.    **       <
25010 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
25020 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
25030 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61  .    **       pa
25040 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
25050 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c  ).    **     ROL
25060 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
25070 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58   **.    ** If (X
25080 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
25090 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
250a0 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
250b0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
250c0 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68      ** out to th
250d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
250e0 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
250f0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
25100 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a  che. Then,.    *
25110 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
25120 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
25130 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64   statement, read
25140 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20  ing page X will 
25150 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61  read.    ** data
25160 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25170 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
25180 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
25190 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
251a0 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74     ** was when t
251b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
251c0 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
251d0 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
251e0 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a  POINT sp".    **
251f0 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
25200 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
25210 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
25220 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25230 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  t data for page 
25240 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  X into the .    
25250 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
25260 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
25270 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
25280 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
25290 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
252a0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
252b0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
252c0 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
252d0 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20   TO sp" is .    
252e0 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  ** executed..   
252f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
25300 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  R(.        rc==S
25310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
25320 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
25330 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
25340 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
25350 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20    ) ){.      rc 
25360 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
25370 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  (pPg);.    }.  .
25380 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
25390 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
253a0 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
253b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
253c0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
253d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
253e0 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
253f0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
25400 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
25410 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
25420 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
25430 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d  ger, pPg);.    }
25440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
25450 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
25460 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
25470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25480 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
25490 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
254a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
254b0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
254c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
254d0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
254e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
254f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
25500 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  ger, rc);.}.../*
25510 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
25520 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
25530 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
25540 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
25550 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
25560 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
25570 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
25580 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
25590 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
255a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
255b0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
255c0 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
255d0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
255e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
255f0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
25600 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
25610 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
25620 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
25630 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
25640 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
25650 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
25660 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
25670 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
25680 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
25690 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
256a0 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
256b0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
256c0 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
256d0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
256e0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
256f0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
25700 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
25710 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
25720 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
25730 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
25740 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
25750 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
25760 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
25770 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
25780 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
25790 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
257a0 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
257b0 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
257c0 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
257d0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
257e0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
257f0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
25800 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
25810 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
25820 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
25830 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
25840 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
25850 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
25860 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
25870 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
25880 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
25890 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
258a0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
258b0 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
258c0 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
258d0 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
258e0 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
258f0 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
25900 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
25910 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
25920 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
25930 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
25940 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
25950 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
25960 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
25970 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
25980 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
25990 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
259a0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
259b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
259c0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
259d0 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
259e0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
259f0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
25a00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25a10 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
25a20 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
25a30 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
25a40 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
25a50 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
25a60 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
25a70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
25a80 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
25a90 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
25aa0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
25ab0 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
25ac0 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
25ad0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25ae0 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
25af0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
25b00 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
25b10 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
25b20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
25b30 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
25b40 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
25b50 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
25b60 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
25b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
25b80 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
25b90 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
25ba0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
25bb0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25bd0 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
25be0 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
25bf0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
25c00 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
25c10 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
25c20 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
25c30 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
25c40 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
25c50 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
25c60 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
25c70 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
25c80 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
25c90 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
25ca0 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
25cb0 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
25cc0 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
25cd0 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
25ce0 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
25cf0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
25d00 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
25d10 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
25d20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25d30 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
25d40 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
25d50 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
25d60 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
25d70 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
25d80 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
25d90 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
25da0 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
25db0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
25dc0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
25dd0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
25de0 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
25df0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
25e00 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
25e10 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
25e20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
25e30 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
25e40 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
25e50 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
25e60 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
25e70 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
25e80 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
25e90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
25ea0 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
25eb0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
25ec0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
25ed0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
25ee0 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
25ef0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
25f00 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
25f10 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
25f20 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
25f30 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
25f40 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
25f50 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
25f60 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
25f70 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
25f80 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
25f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
25fa0 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
25fb0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
25fc0 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
25fd0 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u16 szPageDflt =
25fe0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
25ff0 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
26000 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
26010 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
26020 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
26030 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
26040 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
26050 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
26060 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
26070 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
26080 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
26090 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
260a0 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
260b0 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
260c0 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
260d0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
260e0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
260f0 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
26100 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
26110 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
26120 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
26130 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
26140 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
26150 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
26160 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
26170 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
26180 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
26190 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
261a0 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
261b0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
261c0 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
261d0 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
261e0 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
261f0 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
26200 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
26210 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
26220 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
26230 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
26240 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
26250 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
26260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
26270 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
26280 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
26290 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
262a0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
262b0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
262c0 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
262d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
262e0 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
262f0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
26300 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
26310 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
26320 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
26330 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
26340 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
26350 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
26360 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
26370 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
26380 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
26390 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
263a0 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
263b0 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
263c0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
263d0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
263e0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
263f0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
26400 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
26410 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
26420 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
26430 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
26440 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
26450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
26460 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
26470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
26480 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
26490 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
264a0 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
264b0 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
264c0 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
264d0 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
264e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
264f0 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
26500 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
26510 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
26520 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
26530 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
26540 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
26550 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
26560 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
26570 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
26580 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
26590 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  }..    nPathname
265a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
265b0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
265c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
265d0 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
265e0 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
265f0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
26600 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
26610 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
26620 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
26630 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
26640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
26650 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
26660 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
26670 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
26680 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
26690 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
266a0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
266b0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
266c0 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
266d0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
266e0 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
266f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
26700 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
26710 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
26720 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
26730 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
26740 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26750 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
26760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26790 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
267a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
267b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
267c0 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
267d0 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
267e0 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
267f0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
26800 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
26810 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
26820 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
26830 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
26840 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
26850 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
26860 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
26870 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
26880 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
268b0 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
268c0 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268e0 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
268f0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
26900 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
26910 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
26920 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
26930 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
26940 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
26950 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
26960 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
26970 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
26980 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
26990 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
269a0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
269b0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
269c0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
269d0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
269e0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
269f0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
26a00 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
26a10 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
26a20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
26a30 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
26a40 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
26a50 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
26a60 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
26a70 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
26a80 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
26a90 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
26aa0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
26ab0 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
26ac0 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
26ad0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
26ae0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
26af0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
26b00 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
26b10 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
26b20 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
26b30 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
26b40 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
26b50 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
26b60 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
26b70 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
26b80 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
26b90 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
26ba0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
26bb0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
26bc0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b  E_OMIT_WAL.    +
26bd0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b   nPathname + 4 +
26be0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
26bf0 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
26c00 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
26c10 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
26c20 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
26c30 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
26c40 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
26c50 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
26c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
26c70 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
26c80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26c90 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
26cb0 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
26cc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
26cd0 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
26ce0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
26cf0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
26d00 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
26d10 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
26d20 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
26d30 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
26d40 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
26d50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
26d60 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
26d70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
26d80 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
26d90 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
26da0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
26db0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
26dc0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
26dd0 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
26de0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
26df0 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
26e00 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
26e10 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
26e20 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
26e30 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
26e40 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
26e50 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
26e60 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
26e70 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
26e80 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ame ){.    pPage
26e90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
26ea0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
26eb0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a  nPathname + 1);.
26ec0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
26ed0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
26ee0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
26ef0 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
26f00 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26f10 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
26f20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
26f30 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
26f40 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
26f50 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29  , "-journal", 8)
26f60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
26f70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  ->zFilename[0]==
26f80 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
26f90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d  r->zJournal[0] =
26fa0 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65   0;.    }.#ifnde
26fb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
26fc0 4c 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  L.    else{.    
26fd0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
26fe0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
26ff0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
27000 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
27010 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
27020 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
27030 6d 65 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  me);.      memcp
27040 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
27050 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
27060 6c 22 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 23 65  l", 4);.    }.#e
27070 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
27080 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
27090 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
270a0 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
270b0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
270c0 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
270d0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
270e0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
270f0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
27100 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
27110 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
27120 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27140 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
27150 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
27160 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
27170 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
27180 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
27190 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
271a0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
271b0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
271c0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
271d0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
271e0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
271f0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
27200 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
27210 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
27220 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
27230 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
27240 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
27250 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
27260 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
27270 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
27280 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
27290 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
272a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
272b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
272c0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
272d0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
272e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
272f0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
27300 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
27310 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
27320 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
27330 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
27340 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
27350 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27360 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
27370 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
27380 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
27390 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
273a0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
273b0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
273c0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
273d0 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
273e0 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
273f0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
27400 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
27410 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
27420 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
27430 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
27440 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
27450 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
27460 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
27470 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
27480 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
27490 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
274a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
274b0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
274c0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
274d0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
274e0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
274f0 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
27500 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
27510 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
27520 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
27530 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
27540 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
27550 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
27560 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
27570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
27580 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
27590 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
275a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
275b0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
275c0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
275d0 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
275e0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
275f0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
27600 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
27610 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
27620 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
27630 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
27640 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
27650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
27660 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
27670 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
27690 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
276a0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
276b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
276c0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
276d0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
276e0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
276f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
27700 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
27710 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
27720 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
27730 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
27740 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
27750 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
27760 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
27770 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
27780 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
27790 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
277a0 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
277b0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
277c0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
277d0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
277e0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
277f0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
27800 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
27810 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
27820 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
27830 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
27840 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
27850 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
27860 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
27870 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  R;.    pPager->e
27880 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
27890 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f  _LOCK;.    readO
278a0 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
278b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
278c0 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
278d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
278e0 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
278f0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
27900 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
27910 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
27920 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
27930 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
27940 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
27950 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
27960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27970 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
27980 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
27990 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
279a0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
279b0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
279c0 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
279d0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
279e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
279f0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
27a00 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
27a10 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
27a20 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
27a30 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
27a40 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
27a50 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
27a60 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
27a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
27a80 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
27a90 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
27aa0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
27ab0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
27ac0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
27ad0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
27ae0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
27af0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
27b00 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
27b10 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
27b20 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
27b30 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
27b40 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
27b50 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
27b60 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
27b70 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
27b80 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
27b90 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
27ba0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
27bb0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
27bc0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
27bd0 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
27be0 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
27bf0 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
27c00 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
27c10 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
27c20 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
27c30 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
27c40 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
27c50 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
27c60 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
27c70 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
27c80 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
27c90 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
27ca0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
27cb0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
27cc0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
27cd0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
27ce0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
27cf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
27d00 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
27d10 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
27d20 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
27d30 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
27d40 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
27d50 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
27d60 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
27d70 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
27d80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
27d90 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
27da0 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
27db0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
27dc0 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
27dd0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
27de0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
27df0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61  .#endif.  /* pPa
27e00 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
27e10 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
27e20 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
27e30 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
27e40 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
27e50 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
27e60 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
27e70 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
27e80 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
27e90 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
27ea0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
27eb0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
27ec0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
27ed0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
27ee0 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
27ef0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
27f00 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
27f10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
27f20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
27f30 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
27f40 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
27f50 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
27f60 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
27f70 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
27f80 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
27f90 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
27fa0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
27fb0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
27fc0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
27fd0 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
27fe0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
27ff0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
28000 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
28010 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
28020 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
28030 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
28040 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
28050 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
28060 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
28070 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
28080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
28090 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
280a0 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
280b0 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
280c0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
280d0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
280e0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
280f0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
28100 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
28110 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
28120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
28130 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
28140 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
28150 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
28160 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28170 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
28180 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28190 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
281a0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
281b0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
281c0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
281d0 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
281e0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
281f0 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
28200 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
28210 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
28220 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
28230 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  ; */..  *ppPager
28240 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
28250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28260 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
28270 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
28280 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
28290 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
282a0 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
282b0 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
282c0 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
282d0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
282e0 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
282f0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
28300 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
28310 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
28320 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
28330 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
28340 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
28350 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
28360 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
28370 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
28380 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
28390 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
283a0 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
283b0 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
283c0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
283d0 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
283e0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
283f0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
28400 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
28410 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
28420 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
28430 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
28440 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
28450 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
28460 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
28470 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
28480 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
28490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
284a0 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
284b0 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
284c0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
284d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
284e0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
284f0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
28500 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
28510 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
28520 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
28530 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
28540 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
28550 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
28560 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28570 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28580 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
28590 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
285a0 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
285b0 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
285c0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
285d0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
285e0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
285f0 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
28600 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
28610 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
28620 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
28630 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
28640 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
28650 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
28660 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
28670 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
28680 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
28690 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
286a0 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
286b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
286c0 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
286d0 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
286e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
286f0 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
28700 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
28710 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28720 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
28730 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
28740 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
28750 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
28760 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
28770 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
28780 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
28790 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
287a0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
287b0 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
287c0 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
287d0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
287e0 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
287f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
28800 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
28810 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28820 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
28830 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
28840 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
28850 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
28860 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
28870 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
28880 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
28890 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
288a0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
288b0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
288c0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
288d0 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
288e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
288f0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
28900 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
28910 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28920 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
28930 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
28940 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31    int exists = 1
28950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28960 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
28970 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
28980 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72  sent */.  int jr
28990 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65  nlOpen = !!isOpe
289a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
289b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
289c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
289d0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
289e0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
289f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28a00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28a10 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 61 73 73 65  _NONE );..  asse
28a20 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
28a30 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
28a40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
28a50 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
28a60 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
28a70 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
28a80 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
28a90 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
28aa0 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
28ab0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
28ac0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
28ad0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
28ae0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
28af0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
28b00 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
28b10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28b20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
28b30 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
28b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28b50 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
28b60 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
28b70 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
28b80 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
28b90 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
28ba0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
28bb0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
28bc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
28bd0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
28be0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
28bf0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
28c00 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
28c10 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
28c20 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
28c30 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
28c40 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
28c50 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
28c60 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
28c70 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
28c80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28c90 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
28ca0 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
28cb0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
28cc0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
28cd0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
28ce0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
28cf0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
28d00 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
28d10 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
28d20 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
28d30 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
28d40 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
28d50 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
28d60 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
28d70 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
28d80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
28d90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
28da0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
28db0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
28dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
28dd0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ocked ){.      P
28de0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
28df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
28e00 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
28e10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28e20 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  /..      /* Chec
28e30 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  k the size of th
28e40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28e50 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20   If it consists 
28e60 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20  of 0 pages,.    
28e70 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65    ** then delete
28e80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28e90 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65  e. See the heade
28ea0 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  r comment above 
28eb0 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  for .      ** th
28ec0 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65  e reasoning here
28ed0 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62  .  Delete the ob
28ee0 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
28ef0 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20  ile under.      
28f00 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ** a RESERVED lo
28f10 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65  ck to avoid race
28f20 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20   conditions and 
28f30 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69  to avoid violati
28f40 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33  ng.      ** [H33
28f50 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  020]..      */. 
28f60 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
28f70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
28f80 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
28f90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28fa0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
28fb0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
28fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
28fd0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
28fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28ff0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
29000 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
29010 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
29020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29030 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
29040 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
29050 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
29060 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
29070 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
29080 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
29090 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
290a0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
290b0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
290c0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
290d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
290e0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
290f0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
29100 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
29110 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
29120 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
29130 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
29140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29150 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
29160 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
29170 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
29180 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
29190 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
291a0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
291b0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
291c0 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
291d0 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
291e0 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
291f0 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
29200 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
29210 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
29220 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
29230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
29240 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
29250 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
29260 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
29270 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
29280 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
29290 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
292a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
292b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
292c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
292d0 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
292e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
292f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29300 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29310 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
29320 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29330 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
29340 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
29350 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
29360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
29380 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
29390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
293a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
293b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
293c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
293d0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
293e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
293f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
29400 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
29410 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
29420 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
29430 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
29440 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
29450 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
29460 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
29470 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
29480 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
29490 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
294a0 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
294b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
294c0 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  s has a zero hea
294d0 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
294e0 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
294f0 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
29500 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
29510 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
29520 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
29530 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
29540 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
29550 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
29560 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
29570 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
29580 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
29590 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
295a0 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
295b0 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
295c0 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
295d0 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
295e0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
295f0 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
29600 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
29610 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
29620 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
29630 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
29640 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
29650 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
29660 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
29670 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
29680 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
29690 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
296a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
296b0 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
296c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
296d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
296e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
296f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29700 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
29710 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29720 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
29730 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
29740 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
29750 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
29760 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
29770 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
29780 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
29790 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
297a0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
297b0 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
297c0 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
297d0 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
297e0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
297f0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
29800 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29810 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
29820 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
29830 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
29840 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
29850 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
29860 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
29870 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
29880 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
29890 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
298a0 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
298b0 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
298c0 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
298d0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
298e0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
298f0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
29900 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
29910 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
29920 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
29930 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
29940 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
29950 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
29960 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
29970 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
29980 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
29990 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
299a0 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
299b0 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
299c0 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
299d0 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
299e0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
299f0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
29a00 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
29a10 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
29a20 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
29a30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29a40 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
29a50 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
29a60 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
29a70 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
29a80 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
29a90 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
29aa0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
29ab0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
29ac0 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
29ad0 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
29ae0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
29af0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
29b00 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
29b10 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
29b20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
29b30 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
29b40 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
29b50 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
29b60 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
29b70 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
29b80 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
29b90 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
29ba0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
29bb0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
29bc0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73  he operation des
29bd0 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62  cribed by (2) ab
29be0 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ove is not attem
29bf0 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65  pted, and if the
29c00 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
29c10 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
29c20 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
29c30 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20  _FULL when this 
29c40 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68  is called,.** th
29c50 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
29c60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
29c70 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d  rned. It is perm
29c80 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68  itted to read th
29c90 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68  e.** database wh
29ca0 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c  en in SQLITE_FUL
29cb0 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  L error state..*
29cc0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
29cd0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
29ce0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
29cf0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
29d00 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20  ed. If an.** IO 
29d10 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
29d20 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
29d30 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
29d40 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
29d50 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72  nal.** file or r
29d60 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
29d70 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
29d80 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
29d90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
29da0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
29db0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
29dc0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
29dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29df0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
29e00 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
29e10 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
29e20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
29e30 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20  recovering from 
29e40 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  error state */..
29e50 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
29e60 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
29e70 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
29e80 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
29e90 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
29ea0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
29eb0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
29ec0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
29ed0 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
29ee0 20 20 2a 2a 20 62 65 20 4e 4f 4e 45 20 6f 72 20    ** be NONE or 
29ef0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
29f00 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
29f10 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
29f20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
29f30 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
29f40 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
29f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
29f60 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
29f70 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
29f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29f90 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
29fa0 45 52 5f 4e 4f 4e 45 20 7c 7c 20 70 50 61 67 65  ER_NONE || pPage
29fb0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
29fc0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
29fd0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
29fe0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
29ff0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
2a000 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2a010 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
2a020 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2a030 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  de; }..  /* If t
2a040 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20  his database is 
2a050 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74  in an error-stat
2a060 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68 61 6e  e, now is a chan
2a070 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a  ce to clear.  **
2a080 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
2a090 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
2a0a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
2a0b0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b  che and rollback
2a0c0 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20 6a 6f  .  ** any hot jo
2a0d0 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2a0e0 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  e-system..  */. 
2a0f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2a100 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Code ){.    if( 
2a110 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2a120 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a  fd) || pPager->z
2a130 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
2a140 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
2a150 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
2a160 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
2a170 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 50  QLITE_OK;.    pP
2a180 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2a190 41 47 45 52 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70  AGER_NONE;.    p
2a1a0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
2a1b0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  r);.  }..  if( !
2a1c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2a1d0 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65  er) && pPager->e
2a1e0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
2a1f0 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
2a200 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2a210 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2a220 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ;..    assert( !
2a230 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67 65 72  MEMDB && !pPager
2a240 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2a250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a260 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2a270 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2a280 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2a290 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  t( pPager->noRea
2a2a0 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61 67  dlock==0 || pPag
2a2b0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  er->readOnly );.
2a2c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2a2d0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 29  >noReadlock==0 )
2a2e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2a2f0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2a300 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
2a310 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
2a320 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a340 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2a350 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
2a360 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2a370 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
2a380 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
2a390 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2a3a0 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
2a3b0 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
2a3c0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
2a3d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2a3e0 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
2a3f0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2a400 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
2a410 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2a420 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20  ( !isErrorReset 
2a430 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
2a440 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
2a450 65 72 2c 20 26 69 73 45 72 72 6f 72 52 65 73 65  er, &isErrorRese
2a460 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2a470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a480 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
2a490 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
2a4a0 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f  }.    if( isErro
2a4b0 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
2a4c0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
2a4d0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
2a4e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
2a4f0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
2a500 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
2a510 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
2a520 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2a530 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
2a540 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
2a550 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
2a560 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
2a570 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
2a580 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
2a590 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
2a5a0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
2a5b0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2a5c0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
2a5d0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
2a5e0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
2a5f0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
2a600 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2a610 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
2a620 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
2a630 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
2a640 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
2a650 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
2a660 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
2a670 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2a680 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
2a690 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
2a6a0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
2a6b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
2a6c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
2a6d0 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
2a6e0 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
2a6f0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
2a700 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
2a710 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
2a720 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
2a730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a740 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
2a750 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
2a760 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
2a770 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2a780 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
2a790 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
2a7a0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
2a7b0 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
2a7c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2a7d0 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
2a7e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2a7f0 4c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  Lock(pPager, EXC
2a800 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2a810 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a830 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2a840 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2a850 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
2a860 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
2a870 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
2a880 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
2a890 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
2a8a0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
2a8b0 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
2a8c0 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
2a8d0 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
2a8e0 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
2a8f0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
2a900 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2a910 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
2a920 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
2a930 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
2a940 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
2a950 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
2a960 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
2a970 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
2a980 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
2a990 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
2a9a0 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
2a9b0 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
2a9c0 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
2a9d0 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
2a9e0 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
2a9f0 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
2aa00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2aa10 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
2aa20 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
2aa30 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
2aa40 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
2aa50 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
2aa60 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
2aa70 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
2aa80 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
2aa90 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
2aaa0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
2aab0 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
2aac0 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
2aad0 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
2aae0 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
2aaf0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
2ab00 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
2ab10 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
2ab20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
2ab30 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
2ab40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
2ab50 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
2ab60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
2ab70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2ab80 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
2ab90 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
2aba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
2abb0 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
2abc0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
2abd0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2abe0 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
2abf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ac00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2ac10 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
2ac20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
2ac30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
2ac40 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2ac50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2ac60 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2ac70 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
2ac80 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2ac90 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2acb0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2acc0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2acd0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2ace0 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
2acf0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2ad00 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2ad10 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2ad20 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
2ad30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2ad40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
2ad50 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2ad60 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
2ad70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ad80 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2ad90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ada0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2adb0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2adc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2add0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ade0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2adf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ae00 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2ae10 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
2ae20 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
2ae30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74 61   the journal sta
2ae40 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69 6e  tus fields to in
2ae50 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
2ae60 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a  have no.      **
2ae70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2ae80 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  l at this time. 
2ae90 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
2aea0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
2aeb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
2aec0 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
2aed0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2aee0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
2aef0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
2af00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2af10 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
2af20 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 0a  d to disk. */. .
2af30 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
2af40 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
2af50 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
2af60 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
2af70 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
2af80 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
2af90 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
2afa0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
2afb0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
2afc0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
2afd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
2afe0 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
2aff0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
2b000 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
2b010 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
2b020 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
2b030 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
2b040 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
2b050 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
2b060 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
2b070 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
2b080 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
2b090 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
2b0a0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
2b0b0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
2b0c0 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
2b0d0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
2b0e0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
2b0f0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  t back..      **
2b100 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
2b110 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2b120 73 20 77 68 69 6c 65 20 73 79 6e 63 69 6e 67 20  s while syncing 
2b130 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
2b140 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
2b150 74 2d 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 72 65  t-journal, there
2b160 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 65   is no need to e
2b170 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73  nter the ERROR s
2b180 74 61 74 65 20 68 65 72 65 2c 20 61 73 0a 20 20  tate here, as.  
2b190 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
2b1a0 20 6e 65 76 65 72 20 6c 65 66 74 20 73 74 61 74   never left stat
2b1b0 65 20 4e 4f 4e 45 20 61 6e 79 68 6f 77 2e 0a 20  e NONE anyhow.. 
2b1c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2b1d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2b1e0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
2b1f0 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
2b200 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
2b210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2b220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b230 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2b240 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2b250 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
2b260 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2b270 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2b280 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2b290 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2b2a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4e 4f 4e  tate = PAGER_NON
2b2b0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
2b2c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b2d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b2e0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2b2f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b310 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2c  osUnlock(pPager,
2b320 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2b330 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2b340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2b350 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
2b360 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2b370 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2b380 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2b390 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2b3a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2b3b0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2b3c0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2b3d0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2b3e0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
2b3f0 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c  ->pBackup || sql
2b400 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
2b410 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2b420 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  che)>0 ){.      
2b430 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
2b440 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
2b450 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
2b460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
2b470 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
2b480 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
2b490 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
2b4a0 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
2b4b0 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
2b4c0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
2b4d0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
2b4e0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
2b4f0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
2b500 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
2b510 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
2b520 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
2b530 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
2b540 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
2b550 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
2b560 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
2b570 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
2b580 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
2b590 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
2b5a0 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
2b5b0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
2b5c0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
2b5d0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
2b5e0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
2b5f0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
2b600 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
2b610 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
2b620 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
2b630 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
2b640 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
2b650 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
2b660 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
2b670 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
2b680 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
2b690 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
2b6a0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
2b6b0 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
2b6c0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
2b6d0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
2b6e0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
2b6f0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
2b700 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
2b710 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
2b720 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
2b730 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
2b740 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  */.      Pgno nP
2b750 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  age = 0;.      c
2b760 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
2b770 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
2b780 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20  FileVers)];..   
2b790 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2b7a0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2b7b0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2b7c0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c  ( rc ) goto fail
2b7d0 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  ed;..      if( n
2b7e0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Page>0 ){.      
2b7f0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
2b800 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
2b810 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
2b820 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
2b830 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b840 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
2b850 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
2b860 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2b870 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
2b880 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
2b8a0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
2b8b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2b8c0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
2b8d0 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
2b8e0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2b8f0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
2b900 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
2b910 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2b920 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
2b930 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
2b940 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
2b950 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
2b960 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
2b970 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2b980 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
2b990 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
2b9a0 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
2b9b0 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
2b9c0 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
2b9d0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
2b9e0 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
2b9f0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
2ba00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2ba10 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
2ba20 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
2ba30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
2ba40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2ba50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2ba60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
2ba70 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
2ba80 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
2ba90 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
2baa0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2bab0 5f 4e 4f 4e 45 20 26 26 20 72 63 3d 3d 53 51 4c  _NONE && rc==SQL
2bac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2bad0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2bae0 41 47 45 52 5f 4e 4f 4e 45 3b 0a 20 20 20 20 72  AGER_NONE;.    r
2baf0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2bb00 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
2bb10 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
2bb20 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
2bb30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bb40 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
2bb50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
2bb60 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
2bb70 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e  >eState==PAGER_N
2bb80 4f 4e 45 29 0a 20 20 20 20 20 20 20 20 7c 7c 20  ONE).        || 
2bb90 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
2bba0 69 76 65 4d 6f 64 65 20 26 26 20 70 61 67 65 72  iveMode && pager
2bbb0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 29 0a  UseWal(pPager)).
2bbc0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2bbd0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2bbe0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2bbf0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
2bc00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
2bc10 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
2bc20 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
2bc30 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
2bc40 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
2bc50 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
2bc60 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
2bc70 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
2bc80 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
2bc90 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
2bca0 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
2bcb0 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
2bcc0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
2bcd0 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
2bce0 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
2bcf0 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
2bd00 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
2bd10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2bd20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
2bd30 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
2bd40 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
2bd50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2bd60 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68  f( (sqlite3Pcach
2bd70 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2bd80 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20  ->pPCache)==0). 
2bd90 20 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65    && (!pPager->e
2bda0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
2bdb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2bdc0 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  ff>0) .  ){.    
2bdd0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
2bde0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
2bdf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
2be00 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
2be10 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
2be20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
2be30 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
2be40 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
2be50 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
2be60 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
2be70 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
2be80 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
2be90 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
2bea0 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
2beb0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2bec0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
2bed0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
2bee0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
2bef0 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
2bf00 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
2bf10 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
2bf20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
2bf30 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
2bf40 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
2bf50 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
2bf60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf70 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
2bf80 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
2bf90 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
2bfa0 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
2bfb0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
2bfc0 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
2bfd0 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
2bfe0 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
2bff0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2c000 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
2c010 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
2c020 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
2c030 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
2c040 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
2c050 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
2c060 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
2c070 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
2c080 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
2c090 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
2c0a0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
2c0b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2c0c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
2c0d0 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
2c0e0 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
2c0f0 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
2c100 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
2c110 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
2c120 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2c130 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
2c140 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
2c150 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
2c160 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
2c170 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
2c180 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
2c190 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
2c1a0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
2c1b0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2c1c0 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
2c1d0 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
2c1e0 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
2c1f0 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
2c200 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
2c210 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
2c220 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
2c230 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
2c240 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
2c250 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
2c260 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
2c270 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
2c280 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
2c290 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
2c2a0 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
2c2b0 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74  s in two seperat
2c2c0 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  e scenarios:.**.
2c2d0 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
2c2e0 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
2c2f0 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
2c300 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
2c310 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
2c320 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
2c330 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
2c340 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
2c350 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
2c360 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
2c370 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
2c380 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
2c390 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
2c3a0 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
2c3b0 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
2c3c0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
2c3d0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
2c3e0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
2c3f0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
2c400 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65  d of.** being re
2c410 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
2c420 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
2c430 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
2c440 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
2c450 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
2c460 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
2c470 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
2c480 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
2c490 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2c4a0 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
2c4b0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
2c4c0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
2c4d0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
2c4e0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
2c4f0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
2c500 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
2c510 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
2c520 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
2c530 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
2c540 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2c550 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
2c560 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
2c570 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
2c580 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
2c590 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
2c5a0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
2c5b0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
2c5c0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
2c5d0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
2c5e0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
2c5f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2c600 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
2c610 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
2c620 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
2c630 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
2c640 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
2c650 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
2c660 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
2c670 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
2c680 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
2c690 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
2c6a0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2c6b0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
2c6c0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
2c6d0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
2c6e0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
2c6f0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
2c700 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
2c710 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
2c720 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
2c730 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
2c740 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
2c750 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
2c760 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
2c770 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
2c780 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
2c790 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
2c7a0 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
2c7b0 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
2c7c0 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
2c7d0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
2c7e0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
2c7f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
2c800 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
2c810 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
2c820 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
2c830 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2c840 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
2c850 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
2c860 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
2c870 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
2c880 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
2c890 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
2c8a0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
2c8b0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
2c8c0 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
2c8d0 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
2c8e0 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
2c8f0 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
2c900 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2c910 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
2c920 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2c930 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
2c940 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
2c950 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2c960 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2c970 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
2c980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c990 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2c9a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2c9b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
2c9c0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2c9d0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2c9e0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
2c9f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
2ca00 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
2ca10 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
2ca20 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
2ca30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
2ca40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2ca50 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
2ca60 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
2ca70 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
2ca80 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
2ca90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2caa0 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
2cab0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
2cac0 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20  o, 1, ppPage);. 
2cad0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
2cae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
2caf0 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
2cb00 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
2cb10 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
2cb20 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
2cb30 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
2cb40 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
2cb50 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
2cb60 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2cb70 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
2cb80 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
2cb90 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
2cba0 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
2cbb0 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
2cbc0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
2cbd0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2cbe0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2cbf0 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
2cc00 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
2cc10 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
2cc20 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
2cc30 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
2cc40 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
2cc50 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
2cc60 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
2cc70 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
2cc80 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
2cc90 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
2cca0 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
2ccb0 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
2ccc0 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
2ccd0 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
2cce0 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
2ccf0 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
2cd00 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
2cd10 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
2cd20 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
2cd30 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
2cd40 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72  er->nHit);.    r
2cd50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cd60 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
2cd70 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
2cd80 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
2cd90 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
2cda0 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
2cdb0 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
2cdc0 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20  lized.  */..    
2cdd0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
2cde0 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70  r->nMiss);.    p
2cdf0 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  Pg = *ppPage;.  
2ce00 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
2ce10 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
2ce20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
2ce30 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
2ce40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
2ce50 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
2ce60 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
2ce70 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
2ce80 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
2ce90 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
2cea0 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
2ceb0 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
2cec0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
2ced0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
2cee0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
2cef0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2cf00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2cf10 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
2cf20 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
2cf30 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
2cf40 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
2cf50 65 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e  e<(int)pgno || n
2cf60 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
2cf70 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2cf80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
2cf90 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
2cfa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2cfb0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
2cfc0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
2cfd0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
2cfe0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2cff0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
2d000 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
2d010 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
2d020 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
2d030 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
2d040 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
2d050 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
2d060 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
2d070 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
2d080 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
2d090 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
2d0a0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
2d0b0 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
2d0c0 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
2d0d0 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
2d0e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
2d0f0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
2d100 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
2d110 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2d120 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
2d130 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
2d140 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
2d150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d160 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
2d170 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2d180 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
2d190 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2d1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
2d1b0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
2d1c0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
2d1d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2d1e0 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
2d1f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
2d200 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2d210 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d220 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
2d230 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
2d240 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2d250 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
2d260 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
2d270 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
2d280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d290 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
2d2a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d2b0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
2d2c0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
2d2d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
2d2e0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
2d2f0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2d300 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
2d310 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2d320 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2d330 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72  Pager );.      r
2d340 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
2d350 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
2d360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
2d380 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
2d390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
2d3a0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
2d3b0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
2d3c0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
2d3d0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
2d3e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
2d3f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d400 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
2d410 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
2d420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2d430 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
2d440 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
2d450 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
2d460 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
2d470 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
2d480 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
2d490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d4a0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
2d4b0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2d4c0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
2d4d0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
2d4e0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
2d4f0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
2d500 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2d510 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
2d520 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
2d530 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
2d540 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30  . Also, return 0
2d550 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   if the .** page
2d560 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e  r is in PAGER_UN
2d570 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20  LOCK state when 
2d580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d590 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69   called,.** or i
2d5a0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
2d5b0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2d5c0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2d5d0 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  TE_FULL..**.** S
2d5e0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
2d5f0 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
2d600 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2d610 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
2d620 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
2d630 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
2d640 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
2d650 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
2d660 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
2d670 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
2d680 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
2d690 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
2d6a0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
2d6b0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
2d6c0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
2d6d0 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
2d6e0 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
2d6f0 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
2d700 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
2d710 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
2d720 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
2d730 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
2d740 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73  r *pPg = 0;.  as
2d750 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
2d760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
2d770 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
2d780 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
2d790 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
2d7a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2d7b0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
2d7c0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
2d7d0 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
2d7e0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
2d7f0 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e   &pPg);.  return
2d800 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
2d810 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
2d820 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
2d830 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2d840 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2d850 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
2d860 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
2d870 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
2d880 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
2d890 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
2d8a0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
2d8b0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
2d8c0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
2d8d0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
2d8e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2d8f0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
2d900 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d910 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
2d920 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
2d930 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
2d940 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2d950 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
2d960 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
2d970 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
2d980 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
2d990 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
2d9a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d9b0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
2d9c0 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
2d9d0 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
2d9e0 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
2d9f0 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
2da00 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
2da10 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
2da20 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
2da30 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
2da40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
2da50 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
2da60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
2da70 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
2da80 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
2da90 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
2daa0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
2dab0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
2dac0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
2dad0 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
2dae0 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
2daf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2db00 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
2db10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2db20 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
2db30 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
2db40 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
2db50 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
2db60 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
2db70 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
2db80 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
2db90 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
2dba0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
2dbb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2dbc0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
2dbd0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
2dbe0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
2dbf0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
2dc00 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
2dc10 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
2dc20 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
2dc30 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
2dc40 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
2dc50 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
2dc60 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
2dc70 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
2dc80 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
2dc90 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
2dca0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
2dcb0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
2dcc0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
2dcd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2dce0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2dcf0 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
2dd00 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
2dd10 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
2dd20 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2dd30 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
2dd40 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
2dd50 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
2dd60 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
2dd70 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
2dd80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2dd90 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2dda0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
2ddb0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
2ddc0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2ddd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddf0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2de00 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
2de10 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2de20 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2de30 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
2de40 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
2de50 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
2de60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2de70 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 49 4e  =PAGER_WRITER_IN
2de80 49 54 49 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  ITIAL );.  asser
2de90 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2dea0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2deb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2dec0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2ded0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
2dee0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
2def0 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
2df00 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2df10 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
2df20 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
2df30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
2df40 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
2df50 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
2df60 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
2df70 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
2df80 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2df90 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2dfa0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2dfb0 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
2dfc0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
2dfd0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2dfe0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2dff0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
2e000 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
2e010 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
2e020 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
2e030 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
2e040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
2e050 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
2e060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e070 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2e080 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
2e090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e0a0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
2e0b0 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
2e0c0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2e0d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2e0e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e0f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2e100 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2e110 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
2e120 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
2e130 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
2e140 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
2e150 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2e160 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e180 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
2e190 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
2e1a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  */.          SQL
2e1b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2e1c0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
2e1d0 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
2e1e0 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
2e1f0 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
2e200 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
2e210 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
2e220 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
2e230 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
2e240 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2e250 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
2e260 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69           );.  #i
2e270 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2e280 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2e290 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e2a0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
2e2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
2e2c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2e2d0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2e2e0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
2e2f0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
2e300 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c          );.  #el
2e310 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  se.        rc = 
2e320 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2e330 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2e340 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2e350 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  d, flags, 0);.  
2e360 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
2e370 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
2e380 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2e390 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2e3a0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
2e3b0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2e3c0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
2e3d0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
2e3e0 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
2e3f0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
2e400 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
2e410 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
2e420 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e440 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
2e450 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
2e460 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
2e470 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
2e480 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
2e490 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2e4a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
2e4b0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
2e4c0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
2e4d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2e4e0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
2e4f0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
2e500 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
2e510 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
2e520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e530 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2e540 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
2e550 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
2e560 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2e570 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
2e580 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e590 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2e5a0 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41  ER_WRITER_INITIA
2e5b0 4c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  L );.    pPager-
2e5c0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2e5d0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
2e5e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2e5f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
2e600 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
2e610 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
2e620 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
2e630 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
2e640 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
2e650 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2e660 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
2e670 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2e680 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
2e690 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
2e6a0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
2e6b0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
2e6c0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
2e6d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2e6e0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
2e6f0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
2e700 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
2e710 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
2e720 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
2e730 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
2e740 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
2e750 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
2e760 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
2e770 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
2e780 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
2e790 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
2e7a0 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
2e7b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
2e7c0 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
2e7d0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
2e7e0 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
2e7f0 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
2e800 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
2e810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2e820 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
2e830 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
2e840 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
2e850 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
2e860 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
2e870 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
2e880 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
2e890 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
2e8a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2e8b0 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
2e8c0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2e8d0 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
2e8e0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
2e8f0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
2e900 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a  art of it..**.**
2e910 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
2e920 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
2e930 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2e940 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
2e950 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
2e960 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2e970 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
2e980 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
2e990 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
2e9a0 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
2e9b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2e9c0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
2e9d0 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
2e9e0 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
2e9f0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2ea00 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
2ea10 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
2ea20 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
2ea30 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
2ea40 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
2ea50 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
2ea60 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
2ea70 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
2ea80 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
2ea90 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
2eaa0 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
2eab0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
2eac0 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
2ead0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
2eae0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
2eaf0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
2eb00 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
2eb10 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
2eb20 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
2eb30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2eb40 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
2eb50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
2eb60 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
2eb70 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
2eb80 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
2eb90 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
2eba0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2ebb0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
2ebc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2ebd0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2ebe0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
2ebf0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2ec00 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
2ec10 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2ec20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
2ec30 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
2ec40 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
2ec50 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
2ec60 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
2ec70 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
2ec80 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
2ec90 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
2eca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2ecb0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2ecc0 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
2ecd0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
2ece0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
2ecf0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
2ed00 20 3d 20 70 61 67 65 72 4c 6f 63 6b 28 70 50 61   = pagerLock(pPa
2ed10 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
2ed20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
2ed30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ed40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2ed50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2ed60 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2ed70 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
2ed80 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
2ed90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
2eda0 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
2edb0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
2edc0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
2edd0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
2ede0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
2edf0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
2ee00 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
2ee10 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
2ee20 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
2ee30 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
2ee40 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
2ee50 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
2ee60 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
2ee70 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
2ee80 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
2ee90 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
2eea0 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
2eeb0 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
2eec0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
2eed0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
2eee0 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
2eef0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
2ef00 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
2ef10 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
2ef20 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
2ef30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2ef40 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
2ef50 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
2ef60 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
2ef70 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
2ef80 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
2ef90 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
2efa0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2efb0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
2efc0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
2efd0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
2efe0 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
2eff0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
2f000 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
2f010 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
2f020 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
2f030 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2f040 3d 20 70 61 67 65 72 4c 6f 63 6b 28 70 50 61 67  = pagerLock(pPag
2f050 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
2f060 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2f070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
2f080 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
2f090 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
2f0a0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
2f0b0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
2f0c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f0d0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
2f0e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f0f0 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
2f100 49 54 45 52 5f 49 4e 49 54 49 41 4c 20 73 74 61  ITER_INITIAL sta
2f110 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
2f120 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
2f130 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
2f140 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
2f150 5f 49 4e 49 54 49 41 4c 20 6f 72 20 43 41 43 48  _INITIAL or CACH
2f160 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
2f170 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
2f180 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
2f190 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
2f1a0 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
2f1b0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
2f1c0 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
2f1d0 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
2f1e0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
2f1f0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
2f200 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
2f210 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
2f220 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
2f230 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
2f240 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
2f250 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
2f260 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
2f270 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
2f280 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
2f290 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
2f2a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2f2b0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2f2c0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
2f2d0 49 4e 49 54 49 41 4c 3b 0a 20 20 20 20 20 20 70  INITIAL;.      p
2f2e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2f2f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
2f300 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
2f310 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
2f320 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2f330 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
2f340 7b 0a 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72  {.      /* Ignor
2f350 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74  e any IO error t
2f360 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  hat occurs withi
2f370 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  n pager_end_tran
2f380 73 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20  saction(). The. 
2f390 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 20       ** purpose 
2f3a0 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
2f3b0 74 6f 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  to reset the int
2f3c0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
2f3d0 68 65 20 70 61 67 65 72 0a 20 20 20 20 20 20 2a  he pager.      *
2f3e0 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 49 74  * sub-system. It
2f3f0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
2f400 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  if the journal-f
2f410 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f 70 65  ile is not prope
2f420 72 6c 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e  rly.      ** fin
2f430 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20 70  alized at this p
2f440 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69  oint (since it i
2f450 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f  s not a valid jo
2f460 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61  urnal file anywa
2f470 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
2f480 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
2f490 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
2f4a0 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
2f4b0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2f4c0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
2f4d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
2f4e0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
2f4f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2f500 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
2f510 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2f520 45 52 5f 49 4e 49 54 49 41 4c 20 29 3b 0a 20 20  ER_INITIAL );.  
2f530 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2f540 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2f550 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
2f560 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
2f570 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
2f580 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2f590 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f5a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
2f5b0 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
2f5c0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
2f5d0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
2f5e0 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
2f5f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
2f600 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
2f610 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
2f620 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
2f630 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
2f640 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
2f650 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
2f660 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
2f670 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
2f680 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
2f690 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
2f6a0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
2f6b0 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
2f6c0 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
2f6d0 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
2f6e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f6f0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
2f700 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
2f710 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
2f720 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
2f730 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2f740 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
2f750 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2f760 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2f770 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
2f780 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
2f790 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2f7a0 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
2f7b0 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
2f7c0 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
2f7d0 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
2f7e0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
2f7f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2f800 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
2f810 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c  R_WRITER_INITIAL
2f820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2f830 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
2f840 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
2f850 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
2f860 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2f870 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
2f880 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2f890 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f   has been previo
2f8a0 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72  usly detected, r
2f8b0 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65  eport the same e
2f8c0 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e  rror.  ** again.
2f8d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2f8e0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2f8f0 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
2f900 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
2f910 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
2f920 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
2f930 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
2f940 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
2f950 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
2f960 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
2f970 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
2f980 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
2f990 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2f9a0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
2f9b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2f9c0 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
2f9d0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61  E(pPg);..  /* Ma
2f9e0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
2f9f0 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
2fa00 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
2fa10 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
2fa20 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2fa30 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
2fa40 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
2fa50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
2fa60 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
2fa70 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
2fa80 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
2fa90 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2faa0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73  (pPg) ){.    ass
2fab0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
2fac0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
2fad0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fae0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
2faf0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
2fb00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
2fb10 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
2fb20 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
2fb30 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2fb40 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2fb50 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2fb60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2fb70 6e 61 6c 20 6f 72 20 74 68 65 20 63 68 65 63 6b  nal or the check
2fb80 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
2fb90 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
2fba0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68    **.    ** High
2fbb0 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
2fbc0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 6f  s have already o
2fbd0 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65  btained the nece
2fbe0 73 73 61 72 79 20 6c 6f 63 6b 73 0a 20 20 20 20  ssary locks.    
2fbf0 2a 2a 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ** to begin the 
2fc00 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
2fc10 6e 2c 20 62 75 74 20 74 68 65 20 72 6f 6c 6c 62  n, but the rollb
2fc20 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ack journal migh
2fc30 74 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 79 65  t not .    ** ye
2fc40 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
2fc50 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
2fc60 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
2fc70 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2fc80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2fc90 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20  _WRITER_INITIAL 
2fca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2fcb0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
2fcc0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2fcd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fce0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2fcf0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2fd00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
2fd10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2fd20 43 48 45 4d 4f 44 20 29 3b 0a 20 20 20 20 61 73  CHEMOD );.    as
2fd30 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2fd40 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2fd50 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   );.  .    /* Th
2fd60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
2fd70 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
2fd80 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
2fd90 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
2fda0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
2fdb0 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
2fdc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2fdd0 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
2fde0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
2fdf0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2fe00 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
2fe10 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
2fe20 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
2fe30 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
2fe40 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65  al(pPg) && !page
2fe50 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2fe60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2fe70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2fe80 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ger)==0 );.     
2fe90 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
2fea0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2feb0 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  ze && isOpen(pPa
2fec0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2fed0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
2fee0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
2fef0 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
2ff00 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
2ff10 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
2ff20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
2ff30 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
2ff40 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
2ff50 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
2ff60 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2ff70 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
2ff80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
2ff90 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
2ffa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2ffb0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
2ffc0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
2ffd0 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
2ffe0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2fff0 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
30000 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
30010 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
30020 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
30030 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
30040 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
30050 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
30060 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
30070 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
30080 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
30090 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
300a0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
300b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
300c0 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  lOff, pPg->pgno)
300d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
300e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
300f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30100 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
30110 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
30120 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
30130 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
30140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30150 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
30160 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
30170 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
30180 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
30190 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
301a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
301b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
301c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
301d0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
301e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
301f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
30200 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
30210 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
30220 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
30230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
30240 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
30250 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
30260 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
30270 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
30280 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
30290 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
302a0 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
302b0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
302c0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
302d0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
302e0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
302f0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
30300 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
30310 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
30320 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
30330 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
30340 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
30350 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
30360 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
30370 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
30380 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
30390 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
303a0 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
303b0 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
303c0 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75  curred while jou
303d0 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
303e0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
303f0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
30400 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
30410 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
30420 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
30430 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
30440 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
30450 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
30460 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
30470 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
30480 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
30490 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
304a0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
304b0 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
304c0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
304d0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
304e0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
304f0 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
30500 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
30510 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
30520 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
30530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30540 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
30550 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
30560 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
30570 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
30580 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
30590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
305a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  e .        ** tr
305b0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
305c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
305d0 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
305e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
305f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30620 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
30630 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
30640 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30650 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
30660 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
30670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
30680 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
30690 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
306a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
306b0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
306c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
306d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
306e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
306f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
30700 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
30710 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
30720 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
30730 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
30740 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30760 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
30770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
30780 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30790 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
307a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
307b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
307c0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
307d0 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
307e0 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
307f0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
30800 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
30810 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
30820 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
30830 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
30840 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
30850 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
30860 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
30870 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
30880 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
30890 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
308a0 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
308b0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
308c0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
308d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
308e0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
308f0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
30900 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
30910 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
30920 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
30930 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
30940 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
30950 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
30960 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
30970 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
30980 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
30990 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
309a0 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
309b0 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
309c0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
309d0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
309e0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
309f0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
30a00 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
30a10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
30a20 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
30a30 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
30a40 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
30a50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
30a60 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
30a70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
30a80 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
30a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30aa0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
30ab0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
30ac0 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  le. This routine
30ad0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
30ae0 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e  before .** makin
30af0 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  g changes to a p
30b00 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  age. The caller 
30b10 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
30b20 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20  eturn value .** 
30b30 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
30b40 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
30b50 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e  not to change an
30b60 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65  y page data unle
30b70 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ss .** this rout
30b80 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
30b90 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
30ba0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
30bb0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
30bc0 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
30bd0 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
30be0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
30bf0 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
30c00 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
30c10 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
30c20 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
30c30 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
30c40 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
30c50 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
30c60 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
30c70 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
30c80 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
30c90 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
30ca0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
30cb0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
30cc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
30cd0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
30ce0 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
30cf0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
30d00 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
30d10 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
30d20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30d30 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
30d40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
30d50 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
30d60 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
30d70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
30d80 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
30d90 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
30da0 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
30db0 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
30dc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
30dd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30de0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
30df0 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20 29  WRITER_INITIAL )
30e00 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
30e10 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
30e20 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
30e30 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
30e40 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
30e50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
30e60 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
30e70 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
30e80 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
30e90 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
30ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30eb0 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
30ec0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
30ed0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
30ee0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
30ef0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
30f00 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30f10 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
30f20 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
30f30 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
30f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30f50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
30f60 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
30f70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
30f80 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
30f90 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
30fa0 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
30fb0 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
30fc0 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20  ncSpill flag to 
30fd0 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
30fe0 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
30ff0 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72  ow.    ** a jour
31000 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
31010 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
31020 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
31030 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  aled by.    ** t
31040 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
31050 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
31060 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
31070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
31080 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30  oNotSyncSpill==0
31090 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
310a0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b  doNotSyncSpill++
310b0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
310c0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
310d0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
310e0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
310f0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
31100 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
31110 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
31120 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
31130 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
31140 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
31150 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
31160 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
31170 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
31180 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
31190 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
311a0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
311b0 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
311c0 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
311d0 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Size;.    if( pP
311e0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
311f0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
31200 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
31210 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
31220 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
31230 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
31240 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
31250 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
31260 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
31270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
31280 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
31290 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
312a0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
312b0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
312c0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
312d0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
312e0 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
312f0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
31300 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
31310 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
31320 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
31330 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
31340 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
31350 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
31360 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
31370 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
31380 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
31390 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
313a0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
313b0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
313c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
313d0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
313e0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
313f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31410 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31420 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
31430 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31440 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
31450 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
31460 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
31470 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
31480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31490 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
314a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
314b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
314c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
314d0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
314e0 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
314f0 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
31500 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
31510 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
31520 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
31530 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
31540 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
31550 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
31560 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
31570 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
31580 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
31590 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
315a0 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
315b0 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
315c0 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
315d0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
315e0 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
315f0 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
31600 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
31610 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
31620 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
31630 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
31640 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
31650 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
31660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
31670 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
31680 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
31690 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
316a0 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
316b0 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
316c0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
316d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
316e0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
316f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
31700 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
31710 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
31720 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
31730 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
31740 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69  i=0; ii<nPage; i
31750 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
31760 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
31770 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
31780 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
31790 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
317a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
317b0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
317c0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
317d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
317e0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
317f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
31810 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
31820 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b  tSyncSpill==1 );
31830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
31840 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20  otSyncSpill--;. 
31850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
31860 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
31870 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
31880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31890 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
318a0 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
318b0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
318c0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
318d0 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
318e0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
318f0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
31900 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
31910 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
31920 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
31930 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
31940 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
31950 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31960 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
31970 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
31980 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
31990 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
319a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
319b0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
319c0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
319d0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
319e0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
319f0 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
31a00 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
31a10 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
31a20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
31a30 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
31a40 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
31a50 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
31a60 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
31a70 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
31a80 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
31a90 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
31aa0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
31ab0 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
31ac0 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
31ad0 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
31ae0 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
31af0 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
31b00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
31b10 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
31b20 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
31b30 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
31b40 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  d. The pager mar
31b50 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
31b60 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
31b70 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
31b80 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
31b90 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
31ba0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
31bb0 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61  mization can qua
31bc0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
31bd0 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45   of large .** DE
31be0 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  LETE operations.
31bf0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
31c00 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
31c10 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
31c20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
31c30 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
31c40 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
31c50 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
31c60 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
31c70 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  =0 ){.    PAGERT
31c80 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54  RACE(("DONT_WRIT
31c90 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
31ca0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
31cb0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
31cc0 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
31cd0 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
31ce0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
31cf0 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  o)).    pPg->fla
31d00 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
31d10 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
31d20 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
31d30 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
31d40 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
31d50 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
31d60 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  f.  }.}../*.** T
31d70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
31d80 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
31d90 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
31da0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31db0 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
31dc0 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
31dd0 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
31de0 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
31df0 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
31e00 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
31e10 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a  e pager file..**
31e20 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72  .** If the isDir
31e30 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20  ectMode flag is 
31e40 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
31e50 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69  is done by calli
31e60 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
31e70 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61  gerWrite() on pa
31e80 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge 1, then modif
31e90 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
31ea0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  s of the.** page
31eb0 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63   data. In this c
31ec0 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ase the file wil
31ed0 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65  l be updated whe
31ee0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
31ef0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
31f00 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
31f10 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   The isDirectMod
31f20 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20  e flag may only 
31f30 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  be non-zero if t
31f40 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
31f50 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20  ompiled.** with 
31f60 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
31f70 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d  E_ATOMIC_WRITE m
31f80 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e  acro defined. In
31f90 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
31fa0 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f  f isDirect is no
31fb0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
31fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
31fd0 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74  s updated direct
31fe0 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67  ly.** by writing
31ff0 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73   an updated vers
32000 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73  ion of page 1 us
32010 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ing a call to th
32020 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57  e .** sqlite3OsW
32030 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rite() function.
32040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
32050 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
32060 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
32070 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
32080 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ectMode){.  int 
32090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
320a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
320b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
320c0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
320d0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
320e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
320f0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
32100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
32110 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
32120 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
32130 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69   Declare and ini
32140 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74  tialize constant
32150 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65   integer 'isDire
32160 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  ct'. If the.  **
32170 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
32180 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
32190 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
321a0 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65  ild, then isDire
321b0 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69  ct.  ** is initi
321c0 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
321d0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
321e0 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70  e isDirectMode p
321f0 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f  arameter.  ** to
32200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
32210 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
32220 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
32230 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ero..  **.  ** T
32240 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
32250 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  if the atomic-wr
32260 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
32270 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61   is not.  ** ena
32280 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
32290 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c  time, the compil
322a0 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20  er can omit the 
322b0 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69  tests of.  ** 'i
322c0 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20  sDirect' below, 
322d0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
322e0 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e  lock enclosed in
322f0 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69   the.  ** "if( i
32300 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69  sDirect )" condi
32310 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
32320 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
32330 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20  _ATOMIC_WRITE.# 
32340 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
32350 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69  DE 0.  assert( i
32360 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
32370 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32380 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
32390 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  e);.#else.# defi
323a0 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69  ne DIRECT_MODE i
323b0 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64  sDirectMode.#end
323c0 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  if..  if( !pPage
323d0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
323e0 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ne && pPager->db
323f0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67  Size>0 ){.    Pg
32400 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20  Hdr *pPgHdr;    
32410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
32420 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32430 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68   1 */.    u32 ch
32440 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20  ange_counter;   
32450 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
32460 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e  al value of chan
32470 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
32480 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
32490 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
324a0 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
324b0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
324c0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
324d0 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
324e0 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
324f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32500 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
32510 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
32520 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
32530 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
32540 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
32550 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
32560 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
32570 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
32580 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
32590 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
325a0 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
325b0 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
325c0 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a  .  When not in .
325d0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f      ** direct mo
325e0 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c  de, page 1 is al
325f0 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63  ways held in cac
32600 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  he and hence the
32610 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20   PagerGet().    
32620 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61  ** above is alwa
32630 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20  ys successful - 
32640 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53  hence the ALWAYS
32650 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   on rc==SQLITE_O
32660 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  K..    */.    if
32670 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26  ( !DIRECT_MODE &
32680 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c  & ALWAYS(rc==SQL
32690 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
326a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
326b0 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
326c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
326d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
326e0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  .      /* Increm
326f0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
32700 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
32710 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
32720 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63  e 24. */.      c
32730 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
32740 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
32750 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46  (u8*)pPager->dbF
32760 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20  ileVers);.      
32770 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
32780 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
32790 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
327a0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
327b0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
327c0 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f       /* Also sto
327d0 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
327e0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
327f0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
32800 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 74   in.      ** byt
32810 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
32820 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
32830 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
32840 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
32850 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61 6c 69        ** is vali
32860 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75 74 33  d. */.      put3
32870 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
32880 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c  gHdr->pData)+92,
32890 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
328a0 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
328b0 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
328c0 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
328d0 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
328e0 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ER);..      /* I
328f0 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72  f running in dir
32900 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ect mode, write 
32910 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32920 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69  page 1 to the fi
32930 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  le. */.      if(
32940 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a   DIRECT_MODE ){.
32950 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
32960 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20  id *zBuf;.      
32970 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32980 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29  ->dbFileSize>0 )
32990 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
329a0 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72 2d  (pPager, pPgHdr-
329b0 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72 63  >pData, 1, 6, rc
329c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a  =SQLITE_NOMEM, z
329d0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Buf);.        if
329e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
329f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
32a00 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
32a10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
32a20 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
32a30 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
32a40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
32a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32a60 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
32a70 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
32a80 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  e = 1;.        }
32a90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
32ab0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
32ac0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
32ad0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
32ae0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
32af0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
32b00 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
32b10 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  gHdr);.  }.  ret
32b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32b30 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
32b40 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
32b50 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
32b60 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
32b70 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
32b80 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
32b90 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
32ba0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
32bb0 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20  l, or called on 
32bc0 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
32bd0 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
32be0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
32bf0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
32c00 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
32c10 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
32c20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
32c30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
32c40 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
32c50 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
32c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32c80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
32c90 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
32ca0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
32cb0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
32cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32cd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
32ce0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
32cf0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
32d00 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
32d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
32d30 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
32d40 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65   be called while
32d50 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
32d60 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 69  tion is active i
32d70 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  n.** rollback. I
32d80 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
32d90 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
32da0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
32db0 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
32dc0 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  wise, if the con
32dd0 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  nection does not
32de0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 6e   already have an
32df0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
32e00 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
32e10 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74 74  ase file, an att
32e20 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
32e30 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a  obtain one..**.*
32e40 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53 49  * If the EXCLUSI
32e50 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  VE lock is alrea
32e60 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20 61  dy held or the a
32e70 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
32e80 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65 73   it is.** succes
32e90 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e  sful, or the con
32ea0 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41  nection is in WA
32eb0 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f  L mode, SQLITE_O
32ec0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
32ed0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69 74  * Otherwise, eit
32ee0 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20  her SQLITE_BUSY 
32ef0 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  or an SQLITE_IOE
32f00 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
32f10 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
32f20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
32f30 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
32f40 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
32f50 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
32f60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
32f70 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32f80 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
32f90 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20 20  _CACHEMOD .     
32fa0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
32fb0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
32fc0 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20  R_DBMOD .       
32fd0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
32fe0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
32ff0 49 4e 49 54 49 41 4c 20 0a 20 20 29 3b 0a 20 20  INITIAL .  );.  
33000 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33010 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33020 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70  r) );.  if( 0==p
33030 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33040 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  r) ){.    rc = p
33050 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
33060 6b 28 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f  k(pPager, PAGER_
33070 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a  EXCLUSIVE);.  }.
33080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33090 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
330a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
330b0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
330c0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
330d0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
330e0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
330f0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
33100 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
33110 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
33120 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
33130 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
33140 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
33150 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
33160 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
33170 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
33180 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
33190 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
331a0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
331b0 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  res that:.**.** 
331c0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
331d0 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
331e0 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c  nter is updated,
331f0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72  .**   * the jour
33200 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75  nal is synced (u
33210 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63  nless the atomic
33220 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
33230 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a  ion is used),.**
33240 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70     * all dirty p
33250 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
33260 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
33270 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74   file, .**   * t
33280 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33290 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69   is truncated (i
332a0 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64  f required), and
332b0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
332c0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
332d0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  . .**.** The onl
332e0 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d  y thing that rem
332f0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
33300 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
33310 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a  s to finalize .*
33320 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63  * (delete, trunc
33330 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
33340 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74  first part of) t
33350 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33360 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  (or .** delete t
33370 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
33380 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
33390 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
333a0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
333b0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
333c0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
333d0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
333e0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
333f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
33400 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
33410 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
33420 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
33430 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
33440 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
33450 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
33460 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
33470 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
33480 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
33490 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
334a0 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
334b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
334c0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
334d0 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
334e0 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
334f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
33500 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
33510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33520 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
33530 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
33540 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
33550 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
33560 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
33570 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20  har *zMaster,   
33580 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
33590 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73  ot NULL, the mas
335a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
335b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63   */.  int noSync
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
335e0 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20   omit the xSync 
335f0 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a  on the db file *
33600 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
33610 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
33620 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
33630 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
33640 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
33650 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
33660 5f 49 4e 49 54 49 41 4c 0a 20 20 20 20 20 20 20  _INITIAL.       
33670 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
33680 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
33690 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
336a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
336b0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
336c0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
336d0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
336e0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
336f0 29 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54  );..#if 0.  /* T
33700 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73  he dbOrigSize is
33710 20 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f   never set if jo
33720 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a  urnal_mode=OFF *
33730 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
33740 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
33750 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
33760 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72  DE_OFF || pPager
33770 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
33780 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
33790 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  If a prior error
337a0 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72   occurred, repor
337b0 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61  t that error aga
337c0 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  in. */.  if( pPa
337d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
337e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
337f0 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
33800 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
33810 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
33820 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
33830 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
33840 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
33850 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
33860 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a  >dbSize));..  /*
33870 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   If no database 
33880 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65  changes have bee
33890 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65  n made, return e
338a0 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  arly. */.  if( p
338b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
338c0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
338d0 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c  MOD ) return SQL
338e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d  ITE_OK;..  if( M
338f0 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49  EMDB ){.    /* I
33900 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
33910 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
33920 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
33930 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
33940 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63  this.    ** func
33950 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
33960 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
33970 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d   is mostly a no-
33980 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e  op.  However, an
33990 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20  y.    ** backup 
339a0 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64  in progress need
339b0 73 20 74 6f 20 62 65 20 72 65 73 74 61 72 74 65  s to be restarte
339c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
339d0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
339e0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
339f0 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  up);.  }else{.  
33a00 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
33a10 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
33a20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
33a30 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
33a40 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
33a50 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
33a60 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
33a70 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33a80 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
33a90 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d  , pList, pPager-
33aa0 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20  >dbSize, 1, .   
33ab0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
33ac0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61  ->fullSync ? pPa
33ad0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
33ae0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
33af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33b00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33b10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33b20 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
33b30 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33b40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
33b60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
33b70 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
33b80 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
33b90 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
33ba0 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
33bb0 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
33bc0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
33bd0 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
33be0 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20  imization.      
33bf0 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
33c00 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
33c10 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
33c20 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
33c30 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74  e .      ** runt
33c40 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
33c50 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
33c60 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  n: .      **.   
33c70 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66     **    * The f
33c80 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
33c90 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
33ca0 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
33cb0 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
33cc0 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
33cd0 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20  age-size, and . 
33ce0 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69       **    * Thi
33cf0 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
33d00 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
33d10 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
33d20 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20  , and.      **  
33d30 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
33d40 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
33d50 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
33d60 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
33d70 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
33d80 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f       ** If the o
33d90 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
33da0 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
33db0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
33dc0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  n the.      ** p
33dd0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
33de0 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
33df0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
33e00 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
33e10 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  e.      ** count
33e20 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
33e30 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
33e40 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
33e50 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
33e60 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70      ** is not ap
33e70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73  plicable to this
33e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61   transaction, ca
33e90 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  ll sqlite3Journa
33ea0 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20 20  lCreate().      
33eb0 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** to make sure 
33ec0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
33ed0 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
33ee0 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  en created, then
33ef0 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70   call.      ** p
33f00 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
33f10 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
33f20 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
33f30 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65  ounter in indire
33f40 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  ct.      ** mode
33f50 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
33f60 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33f70 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
33f80 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
33f90 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
33fa0 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  le,.      ** the
33fb0 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
33fc0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
33fd0 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
33fe0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
33ff0 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65       ** in 'dire
34000 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
34010 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
34020 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
34030 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63  er be.      ** c
34040 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
34050 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
34060 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53     */.  #ifdef S
34070 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
34080 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
34090 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
340a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
340b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
340c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
340d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
340e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
340f0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
34100 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
34110 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
34120 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
34130 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
34140 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26    if( !zMaster &
34150 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
34160 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 26 26  >jfd) .       &&
34170 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34180 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
34190 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20  ize(pPager) .   
341a0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64      && pPager->d
341b0 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64  bSize>=pPager->d
341c0 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20 20 20  bOrigSize.      
341d0 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73   && (0==(pPg = s
341e0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
341f0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
34200 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50  Cache)) || 0==pP
34210 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 20  g->pDirty).     
34220 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55   ){.        /* U
34230 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
34240 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
34250 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
34260 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
34270 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
34280 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
34290 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d  l modify the in-
342a0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
342b0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
342c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
342d0 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74  nclude the updat
342e0 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ed change counte
342f0 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  r and then write
34300 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20   page 1 .       
34310 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
34320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34330 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
34340 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a  e atomic-write .
34350 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65          ** prope
34360 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
34370 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69  file-system, thi
34380 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
34390 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
343a0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
343b0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
343c0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  er, 1);.      }e
343d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
343e0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
343f0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
34400 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
34410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34420 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
34430 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
34440 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
34450 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
34460 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a        }.  #else.
34470 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
34480 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
34490 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
344a0 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69    #endif.      i
344b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
344c0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
344d0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
344e0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
344f0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
34500 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
34510 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
34520 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
34530 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
34540 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
34550 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
34560 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
34570 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
34580 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  file. This can o
34590 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75  nly happen in au
345a0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a  to-vacuum mode..
345b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
345c0 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67  * Before reading
345d0 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20   the pages with 
345e0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72  page numbers lar
345f0 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
34600 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
34610 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
34620 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
34630 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
34640 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ue.      ** that
34650 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
34660 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
34670 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
34680 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ise, the.      *
34690 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
346a0 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65 74  e3PagerGet() ret
346b0 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73  urn zeroed pages
346c0 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20   instead of .   
346d0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61     ** reading da
346e0 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
346f0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
34700 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 68 65   **.      ** Whe
34710 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d  n journal_mode==
34720 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69  OFF the dbOrigSi
34730 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  ze is always zer
34740 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 20  o, so this.     
34750 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20   ** block never 
34760 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f  runs if journal_
34770 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20  mode=OFF..      
34780 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c  */.  #ifndef SQL
34790 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
347a0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50  UUM.      if( pP
347b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
347c0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
347d0 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65  .       && pPage
347e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
347f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34800 45 5f 4f 46 46 0a 20 20 20 20 20 20 29 7b 0a 20  E_OFF.      ){. 
34810 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20         Pgno i;  
34820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
34850 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
34860 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69   const Pgno iSki
34870 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
34880 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65  O(pPager); /* Pe
34890 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20  nding lock page 
348a0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
348b0 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
348c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20  Pager->dbSize;  
348d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
348e0 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a   image size */ .
348f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34900 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
34910 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20  >dbOrigSize;.   
34920 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69       for( i=dbSi
34930 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  ze+1; i<=pPager-
34940 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b  >dbOrigSize; i++
34950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
34960 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
34970 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
34980 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
34990 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
349a0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
349b0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
349c0 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72   /* Page to jour
349d0 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nal */.         
349e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
349f0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
34a00 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
34a10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34a20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34a30 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
34a40 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
34a50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34a60 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
34a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
34a80 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34a90 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
34aa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34ab0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
34ac0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
34ad0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
34ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34af0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
34b00 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
34b10 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20    } .  #endif.  
34b20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
34b30 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
34b40 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
34b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
34b60 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20  f a master .    
34b70 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
34b80 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
34b90 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
34ba0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
34bb0 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ile, .      ** o
34bc0 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20  r if zMaster is 
34bd0 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20  NULL (no master 
34be0 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74  journal), then t
34bf0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
34c00 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -op..      */.  
34c10 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
34c20 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
34c30 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
34c40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34c50 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
34c60 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
34c70 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
34c80 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
34c90 20 66 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20   file and write 
34ca0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
34cb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
34cc0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
34cd0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
34ce0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62  ptimization is b
34cf0 65 69 6e 67 20 75 73 65 64 2c 20 74 68 69 73 20  eing used, this 
34d00 73 79 6e 63 20 77 69 6c 6c 20 6e 6f 74 20 0a 20  sync will not . 
34d10 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 74       ** create t
34d20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34d30 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 72  or perform any r
34d40 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2a  eal IO..      **
34d50 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
34d60 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
34d70 6e 74 65 72 20 70 61 67 65 20 77 61 73 20 6a 75  nter page was ju
34d80 73 74 20 6d 6f 64 69 66 69 65 64 2c 20 75 6e 6c  st modified, unl
34d90 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
34da0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
34db0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
34dc0 73 65 64 20 69 74 20 69 73 20 61 6c 6d 6f 73 74  sed it is almost
34dd0 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 74 68   certain that th
34de0 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  e.      ** journ
34df0 61 6c 20 72 65 71 75 69 72 65 73 20 61 20 73 79  al requires a sy
34e00 6e 63 20 68 65 72 65 2e 20 48 6f 77 65 76 65 72  nc here. However
34e10 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
34e20 65 3d 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  e=exclusive.    
34e30 20 20 2a 2a 20 6f 6e 20 61 20 73 79 73 74 65 6d    ** on a system
34e40 20 75 6e 64 65 72 20 6d 65 6d 6f 72 79 20 70 72   under memory pr
34e50 65 73 73 75 72 65 20 69 74 20 69 73 20 6a 75 73  essure it is jus
34e60 74 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  t possible that 
34e70 74 68 69 73 20 69 73 20 0a 20 20 20 20 20 20 2a  this is .      *
34e80 2a 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 20  * not the case. 
34e90 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
34ea0 69 73 20 6c 69 6b 65 6c 79 20 65 6e 6f 75 67 68  is likely enough
34eb0 20 74 68 61 74 20 74 68 65 20 72 65 64 75 6e 64   that the redund
34ec0 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 78 53 79  ant.      ** xSy
34ed0 6e 63 28 29 20 63 61 6c 6c 20 77 69 6c 6c 20 62  nc() call will b
34ee0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 6e  e changed to a n
34ef0 6f 2d 6f 70 20 62 79 20 74 68 65 20 4f 53 20 61  o-op by the OS a
34f00 6e 79 68 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2f  nyhow. .      */
34f10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
34f20 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
34f30 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
34f40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
34f50 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
34f60 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 20  one_exit;..     
34f70 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
34f80 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
34f90 72 2c 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  r,sqlite3PcacheD
34fa0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
34fb0 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20  >pPCache));.    
34fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
34fe0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34ff0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
35000 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
35010 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
35020 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
35030 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
35040 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
35050 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a  r->pPCache);.  .
35060 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
35070 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
35080 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
35090 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
350a0 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a  e image,.      *
350b0 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72  * then use pager
350c0 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f  _truncate to gro
350d0 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20  w or shrink the 
350e0 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
350f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
35100 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
35110 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
35120 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
35130 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e   nNew = pPager->
35140 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72  dbSize - (pPager
35150 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f  ->dbSize==PAGER_
35160 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
35170 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
35180 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35190 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
351a0 42 4d 4f 44 20 29 3b 0a 20 20 20 20 20 20 20 20  BMOD );.        
351b0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
351c0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
351d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
351e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
351f0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
35200 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
35210 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46   }.  .      /* F
35220 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65  inally, sync the
35230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
35240 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  */.      if( !pP
35250 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
35260 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
35270 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
35280 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
35290 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
352a0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
352b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44       IOTRACE(("D
352c0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
352d0 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger)).    }.  }.
352e0 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e  .commit_phase_on
352f0 65 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63  e_exit:.  if( rc
35300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
35310 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
35320 65 72 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  er) ){.    pPage
35330 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
35340 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
35350 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
35360 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68  rc;.}.../*.** Wh
35370 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35380 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
35390 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
353a0 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  s been completel
353b0 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20  y.** updated to 
353c0 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e  reflect the chan
353d0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ges made by the 
353e0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
353f0 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65  ion and.** synce
35400 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a  d to disk. The j
35410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c  ournal file stil
35420 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  l exists in the 
35430 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20  file-system .** 
35440 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61  though, and if a
35450 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
35460 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  at this point it
35470 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
35480 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61  .** be used as a
35490 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
354a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
354b0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20  nsaction rolled 
354c0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
354d0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69   function finali
354e0 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  zes the journal 
354f0 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20  file, either by 
35500 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72  deleting, .** tr
35510 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74  uncating or part
35520 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74  ially zeroing it
35530 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  , so that it can
35540 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  not be used .** 
35550 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  for hot-journal 
35560 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74  rollback. Once t
35570 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20  his is done the 
35580 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a  transaction is.*
35590 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f  * irrevocably co
355a0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
355b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
355c0 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
355d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
355e0 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  and the pager.**
355f0 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20   moves into the 
35600 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68  error state. Oth
35610 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
35620 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
35630 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
35640 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
35650 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35660 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35670 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
35680 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
35690 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
356a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
356b0 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
356c0 64 20 69 66 20 61 20 70 72 69 6f 72 20 65 72 72  d if a prior err
356d0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
356e0 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75  .  ** But if (du
356f0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
35700 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e  ror elsewhere in
35710 20 74 68 65 20 73 79 73 74 65 6d 29 20 69 74 20   the system) it 
35720 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61  does get.  ** ca
35730 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72  lled, just retur
35740 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  n the same error
35750 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f   code without do
35760 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f  ing anything. */
35770 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
35780 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
35790 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
357a0 72 72 43 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  rrCode;..  asser
357b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
357c0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
357d0 49 4e 49 54 49 41 4c 0a 20 20 20 20 20 20 20 7c  INITIAL.       |
357e0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
357f0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
35800 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c  INISHED.       |
35810 7c 20 28 70 61 67 65 72 55 73 65 57 61 6c 28 70  | (pagerUseWal(p
35820 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
35830 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35840 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 29  WRITER_CACHEMOD)
35850 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
35860 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
35870 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
35880 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
35890 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
358a0 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
358b0 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
358c0 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
358d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
358e0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
358f0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
35900 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20  ode and is.  ** 
35910 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74  using persistent
35920 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
35930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
35940 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
35950 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66   ** The start of
35960 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35970 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
35980 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f  ains a single jo
35990 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
359a0 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  er with the nRec
359b0 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e   field set to 0.
359c0 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e   If such a journ
359d0 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20  al is used as.  
359e0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
359f0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
35a00 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20  nal rollback, 0 
35a10 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
35a20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  made.  ** to the
35a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
35a40 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  So there is no n
35a50 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20  eed to zero the 
35a60 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
35a70 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20  ader. Since the 
35a80 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
35a90 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72  usive mode, ther
35aa0 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a  e is no need.  *
35ab0 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f  * to drop any lo
35ac0 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f  cks either..  */
35ad0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
35ae0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35af0 54 45 52 5f 49 4e 49 54 49 41 4c 20 0a 20 20 20  TER_INITIAL .   
35b00 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
35b10 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
35b20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
35b30 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
35b40 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
35b50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
35b60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
35b70 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
35b80 53 5a 28 70 50 61 67 65 72 29 20 7c 7c 20 21 70  SZ(pPager) || !p
35b90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
35ba0 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  f );.    pPager-
35bb0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
35bc0 52 45 41 44 45 52 3b 0a 20 20 20 20 72 65 74 75  READER;.    retu
35bd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
35be0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
35bf0 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
35c00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
35c10 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
35c20 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
35c30 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
35c40 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  setMaster);.  re
35c50 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
35c60 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
35c70 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
35c80 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65  all changes. The
35c90 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
35ca0 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
35cb0 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ARED mode..**.**
35cc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
35cd0 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b  erforms two task
35ce0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74  s:.**.**   1) It
35cf0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20   rolls back the 
35d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65  journal file, re
35d10 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61  storing all data
35d20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a  base file and .*
35d30 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  *      in-memory
35d40 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20   cache pages to 
35d50 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77  the state they w
35d60 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20  ere in when the 
35d70 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
35d80 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20      was opened, 
35d90 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66  and.**   2) It f
35da0 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
35db0 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68  rnal file, so th
35dc0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65  at it is not use
35dd0 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20  d for hot.**    
35de0 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e    rollback at an
35df0 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  y point in the f
35e00 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62  uture..**.** sub
35e10 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ject to the foll
35e20 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74  owing qualificat
35e30 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  ions:.**.** * If
35e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35e50 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  e is not yet ope
35e60 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
35e70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
35e80 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28  **   then only (
35e90 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  2) is performed.
35ea0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
35eb0 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61  ere is no journa
35ec0 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72  l file.**   to r
35ed0 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  oll back..**.** 
35ee0 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72  * If in an error
35ef0 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
35f00 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74  n SQLITE_FULL, t
35f10 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20  hen task (1) is 
35f20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e  .**   performed.
35f30 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
35f40 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64  task (2). Regard
35f50 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
35f60 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68  ome.**   of eith
35f70 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74  er, the error st
35f80 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
35f90 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
35fa0 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69  e caller.**   (i
35fb0 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54  .e. either SQLIT
35fc0 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
35fd0 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
35fe0 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  * * If the pager
35ff0 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53   is in PAGER_RES
36000 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
36010 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57  n attempt (1). W
36020 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e  hether.**   or n
36030 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 65 73  ot (1) is succes
36040 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d  sful, also attem
36050 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65  pt (2). If succe
36060 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
36070 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74     SQLITE_OK. Ot
36080 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74  herwise, enter t
36090 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
360a0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  nd return the fi
360b0 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20  rst .**   error 
360c0 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  code encountered
360d0 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  . .**.**   In th
360e0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
360f0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
36100 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
36110 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a   written to. .**
36120 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f     So is safe to
36130 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
36140 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20  urnal file even 
36150 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  if the playback 
36160 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e  .**   (operation
36170 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65   1) failed. Howe
36180 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75  ver the pager mu
36190 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  st enter the err
361a0 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73  or state.**   as
361b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
361c0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
361d0 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73  ache are now sus
361e0 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69  pect..**.** * Fi
361f0 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47  nally, if in PAG
36200 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61  ER_EXCLUSIVE sta
36210 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  te, then attempt
36220 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20   (1). Only.**   
36230 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28  attempt (2) if (
36240 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  1) is successful
36250 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
36260 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
36270 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65  ,.**   otherwise
36280 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
36290 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72   state and retur
362a0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
362b0 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20   from the .**   
362c0 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f  failing operatio
362d0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  n..**.**   In th
362e0 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61  is case the data
362f0 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61  base file may ha
36300 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
36310 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a  to. So if the.**
36320 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72     playback oper
36330 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75  ation did not su
36340 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e  cceed it would n
36350 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69  ot be safe to fi
36360 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20  nalize.**   the 
36370 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
36380 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66   needs to be lef
36390 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
363a0 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20  stem so that.** 
363b0 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f    some other pro
363c0 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20  cess can use it 
363d0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
363e0 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62  atabase state (b
363f0 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e  y.**   hot-journ
36400 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f  al rollback)..*/
36410 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36420 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
36430 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
36440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36460 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
36470 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  */.  PAGERTRACE(
36480 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
36490 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
364a0 29 29 29 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 72  )));..  /* Pager
364b0 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 61 20  Rollback() is a 
364c0 6e 6f 2d 6f 70 20 69 66 20 63 61 6c 6c 65 64 20  no-op if called 
364d0 69 6e 20 52 45 41 44 45 52 20 6f 72 20 4e 4f 4e  in READER or NON
364e0 45 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  E state. */.  as
364f0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36500 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36510 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
36520 2d 3e 65 53 74 61 74 65 3c 3d 50 41 47 45 52 5f  ->eState<=PAGER_
36530 52 45 41 44 45 52 20 29 20 72 65 74 75 72 6e 20  READER ) return 
36540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
36550 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
36560 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  ager) ){.    int
36570 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 73   rc2;.    rc = s
36580 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
36590 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56  oint(pPager, SAV
365a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
365b0 20 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20   -1);.    rc2 = 
365c0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
365d0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
365e0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
365f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
36600 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
36610 63 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c2;.  }else if( 
36620 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36630 50 41 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49  PAGER_WRITER_INI
36640 54 49 41 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  TIAL ){.    rc =
36650 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
36660 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
36670 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
36680 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
36690 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
366a0 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
366b0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
366c0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
366d0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
366e0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
366f0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
36700 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
36710 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
36720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
36730 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36740 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
36750 41 43 48 45 4d 4f 44 20 29 7b 0a 20 20 20 20 20  ACHEMOD ){.     
36760 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
36770 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
36780 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
36790 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65        rc2 = page
367a0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
367b0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
367c0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
367d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
367e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
367f0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
36800 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36810 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
36820 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
36830 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
36840 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
36850 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
36860 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
36870 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
36880 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
36890 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
368a0 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
368b0 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
368c0 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 70 65  ake any error pe
368d0 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  rsistent..  */. 
368e0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
368f0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
36900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36910 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
36920 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
36930 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
36940 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
36950 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
36960 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
36970 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20  writable..*/.u8 
36980 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
36990 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
369a0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
369b0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
369c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
369d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
369e0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
369f0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
36a00 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
36a10 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
36a20 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
36a30 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
36a40 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
36a50 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
36a60 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78  eturn the approx
36a70 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  imate number of 
36a80 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
36a90 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65  currently.** use
36aa0 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
36ab0 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
36ac0 64 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20  d cache..*/.int 
36ad0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55  sqlite3PagerMemU
36ae0 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
36af0 72 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67  r){.  int perPag
36b00 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
36b10 70 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65  pageSize + pPage
36b20 72 2d 3e 6e 45 78 74 72 61 20 2b 20 73 69 7a 65  r->nExtra + size
36b30 6f 66 28 50 67 48 64 72 29 0a 20 20 20 20 20 20  of(PgHdr).      
36b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
36b60 20 35 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29   5*sizeof(void*)
36b70 3b 0a 20 20 72 65 74 75 72 6e 20 70 65 72 50 61  ;.  return perPa
36b80 67 65 53 69 7a 65 2a 73 71 6c 69 74 65 33 50 63  geSize*sqlite3Pc
36b90 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
36ba0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 0a 20  ager->pPCache). 
36bb0 20 20 20 20 20 20 20 20 20 20 2b 20 73 71 6c 69            + sqli
36bc0 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50  te3MallocSize(pP
36bd0 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 20 20  ager).          
36be0 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
36bf0 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
36c00 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
36c10 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
36c20 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
36c30 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
36c40 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
36c50 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
36c60 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
36c70 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
36c80 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
36c90 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
36ca0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
36cb0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
36cc0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
36cd0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
36ce0 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
36cf0 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
36d00 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
36d10 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
36d20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
36d30 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
36d40 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
36d50 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
36d60 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
36d70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
36d80 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
36d90 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
36da0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
36db0 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
36dc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36dd0 41 47 45 52 5f 4e 4f 4e 45 20 3f 20 2d 31 20 3a  AGER_NONE ? -1 :
36de0 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64   (int) pPager->d
36df0 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
36e00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3b 0a  pPager->eState;.
36e10 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
36e20 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
36e30 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
36e40 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
36e50 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
36e60 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
36e70 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
36e80 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
36e90 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
36ea0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
36eb0 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
36ec0 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
36ed0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
36ee0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
36ef0 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f  memory pager..*/
36f00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36f10 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a  rIsMemdb(Pager *
36f20 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
36f30 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a  n MEMDB;.}../*.*
36f40 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
36f50 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  re are at least 
36f60 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70  nSavepoint savep
36f70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74  oints open. If t
36f80 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72  here are.** curr
36f90 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  ently less than 
36fa0 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e  nSavepoints open
36fb0 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20  , then open one 
36fc0 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
36fd0 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70  ts.** to make up
36fe0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e   the difference.
36ff0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
37000 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20  f savepoints is 
37010 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c  already.** equal
37020 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20   to nSavepoint, 
37030 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
37040 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
37050 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
37060 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
37070 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
37080 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
37090 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
370a0 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
370b0 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  g the sub-journa
370c0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20  l file, then an 
370d0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
370e0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
370f0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
37100 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
37110 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
37120 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
37130 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  er, int nSavepoi
37140 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
37150 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
37160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37170 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
37180 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e  */.  int nCurren
37190 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  t = pPager->nSav
371a0 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f  epoint;        /
371b0 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
371c0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a   of savepoints *
371d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
371e0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
371f0 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41  ER_WRITER_INITIA
37200 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  L );.  assert( a
37210 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37220 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
37230 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e  if( nSavepoint>n
37240 43 75 72 72 65 6e 74 20 26 26 20 70 50 61 67 65  Current && pPage
37250 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
37260 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
37270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37290 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
372a0 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53 61  e */.    PagerSa
372b0 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20  vepoint *aNew;  
372c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372d0 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61 53   /* New Pager.aS
372e0 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 2a  avepoint array *
372f0 2f 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  /..    /* Grow t
37300 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
37310 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
37320 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
37330 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
37340 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
37350 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
37360 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
37370 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
37380 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
37390 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
373a0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
373b0 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
373c0 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
373d0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
373e0 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
373f0 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
37400 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
37410 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
37420 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
37430 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
37440 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
37450 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
37460 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
37470 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
37480 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
37490 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
374a0 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
374b0 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
374c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
374d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
374e0 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
374f0 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
37500 65 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  e the PagerSavep
37510 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 20  oint structures 
37520 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20  just allocated. 
37530 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43  */.    for(ii=nC
37540 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65  urrent; ii<nSave
37550 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
37560 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72      aNew[ii].nOr
37570 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ig = pPager->dbS
37580 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ize;.      if( i
37590 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
375a0 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
375b0 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20  urnalOff>0 ){.  
375c0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
375d0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
375e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
375f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37600 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
37610 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  et = JOURNAL_HDR
37620 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
37630 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b     }.      aNew[
37640 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50  ii].iSubRec = pP
37650 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20  ager->nSubRec;. 
37660 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49       aNew[ii].pI
37670 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c  nSavepoint = sql
37680 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
37690 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
376a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65  ;.      if( !aNe
376b0 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
376c0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  nt ){.        re
376d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
376e0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
376f0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
37700 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
37710 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 53 61      sqlite3WalSa
37720 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2d 3e  vepoint(pPager->
37730 70 57 61 6c 2c 20 61 4e 65 77 5b 69 69 5d 2e 61  pWal, aNew[ii].a
37740 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20  WalData);.      
37750 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
37760 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 69 2b  nSavepoint = ii+
37770 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
37780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
37790 76 65 70 6f 69 6e 74 3d 3d 6e 53 61 76 65 70 6f  vepoint==nSavepo
377a0 69 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  int );.    asser
377b0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
377c0 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  int(pPager);.  }
377d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
377e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
377f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
37800 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
37810 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
37820 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20  a savepoint..** 
37830 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
37840 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
37850 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65  back need not be
37860 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
37870 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73  ly .** created s
37880 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
37890 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20  Parameter op is 
378a0 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41  always either SA
378b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
378c0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
378d0 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20  LEASE..** If it 
378e0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
378f0 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61  EASE, then relea
37900 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74  se and destroy t
37910 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74  he savepoint wit
37920 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65  h.** index iSave
37930 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20  point. If it is 
37940 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
37950 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63  CK, then rollbac
37960 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a  k all changes.**
37970 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
37980 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 70  red since the sp
37990 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
379a0 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
379b0 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  *.** The savepoi
379c0 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  nt to rollback o
379d0 72 20 72 65 6c 65 61 73 65 20 69 73 20 69 64 65  r release is ide
379e0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
379f0 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f  eter .** iSavepo
37a00 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  int. A value of 
37a10 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61  0 means to opera
37a20 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d  te on the outerm
37a30 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ost savepoint.**
37a40 20 28 74 68 65 20 66 69 72 73 74 20 63 72 65 61   (the first crea
37a50 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66  ted). A value of
37a60 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
37a70 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72  nt-1) means oper
37a80 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  ate.** on the mo
37a90 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
37aa0 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  ted savepoint. I
37ab0 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f iSavepoint is 
37ac0 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
37ad0 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
37ae0 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20  t-1), then this 
37af0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
37b00 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  -op..**.** If a 
37b10 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 69  negative value i
37b20 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
37b30 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
37b40 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
37b50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
37b60 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
37b70 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20  is different to 
37b80 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
37b90 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
37ba0 28 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20  () because this 
37bb0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
37bc0 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74  t terminate.** t
37bd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
37be0 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  r unlock the dat
37bf0 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72  abase, it just r
37c00 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20  estores the .** 
37c10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
37c20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
37c30 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20  original state. 
37c40 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61  .**.** In any ca
37c50 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  se, all savepoin
37c60 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ts with an index
37c70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53   greater than iS
37c80 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65  avepoint .** are
37c90 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74   destroyed. If t
37ca0 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
37cb0 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d   operation (op==
37cc0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
37cd0 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65  E),.** then save
37ce0 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
37cf0 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79   is also destroy
37d00 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
37d10 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
37d20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
37d30 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
37d40 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
37d50 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
37d60 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72  code if an IO er
37d70 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
37d80 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
37d90 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  .** savepoint. I
37da0 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75  f no errors occu
37db0 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
37dc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e  returned..*/ .in
37dd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  t sqlite3PagerSa
37de0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
37df0 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69  Pager, int op, i
37e00 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
37e10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37e20 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
37e30 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
37e40 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
37e50 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
37e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
37e70 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f  avepoint>=0 || o
37e80 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
37e90 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  LBACK );..  if( 
37ea0 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65  iSavepoint<pPage
37eb0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  r->nSavepoint ){
37ec0 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
37ed0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
37ee0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
37ef0 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20      int nNew;   
37f00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37f10 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61   of remaining sa
37f20 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74  vepoints after t
37f30 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20  his op. */..    
37f40 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
37f50 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  w many savepoint
37f60 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20  s will still be 
37f70 61 63 74 69 76 65 20 61 66 74 65 72 20 74 68 69  active after thi
37f80 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  s.    ** operati
37f90 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76  on. Store this v
37fa0 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68  alue in nNew. Th
37fb0 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63 65  en free resource
37fc0 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20  s associated .  
37fd0 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61    ** with any sa
37fe0 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72  vepoints that ar
37ff0 65 20 64 65 73 74 72 6f 79 65 64 20 62 79 20 74  e destroyed by t
38000 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
38010 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d     */.    nNew =
38020 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 28   iSavepoint + ((
38030 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
38040 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a 20 31  ELEASE ) ? 0 : 1
38050 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
38060 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
38070 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
38080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
38090 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
380a0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
380b0 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
380c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
380d0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
380e0 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
380f0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
38100 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ease of the oute
38110 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c  rmost savepoint,
38120 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a   truncate .    *
38130 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
38140 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  l to zero bytes 
38150 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20  in size. */.    
38160 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
38170 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
38180 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26     if( nNew==0 &
38190 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
381a0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
381b0 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e 63 61    /* Only trunca
381c0 74 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 69  te if it is an i
381d0 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
381e0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rnal. */.       
381f0 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
38200 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
38210 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
38220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38230 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
38240 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20  r->sjfd, 0);.   
38250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
38260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
38270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38280 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
38290 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 0;.      }. 
382a0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c 73 65     }.    /* Else
382b0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
382c0 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70  ack operation, p
382d0 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65 63  layback the spec
382e0 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  ified savepoint.
382f0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
38300 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20  is a temp-file, 
38310 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
38320 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
38330 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20  file has.    ** 
38340 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
38350 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
38360 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  e there have bee
38370 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a  n no changes to.
38380 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
38390 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65  ase file, so the
383a0 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
383b0 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70  ion can be skipp
383c0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  ed..    */.    e
383d0 6c 73 65 20 69 66 28 20 70 61 67 65 72 55 73 65  lse if( pagerUse
383e0 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 69  Wal(pPager) || i
383f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
38400 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
38410 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
38420 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
38430 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
38440 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
38450 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
38460 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
38470 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
38480 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
38490 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
384a0 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
384b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
384c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
384d0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
384e0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
384f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
38500 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
38510 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
38520 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
38530 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
38540 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
38550 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
38560 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
38570 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
38580 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
38590 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
385a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
385b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
385c0 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
385d0 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
385e0 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
385f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
38600 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
38610 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
38620 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
38630 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
38640 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
38650 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
38660 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
38670 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
38680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
38690 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
386a0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
386b0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
386c0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
386d0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
386e0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
386f0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
38700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
38710 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
38720 2d