/ Hex Artifact Content
Login

Artifact 14ec8ea3d27cf4c8b7b6a6139c150b50dd28df3e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
3a50: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
3a60: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
3a70: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a90: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3aa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3ab0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3ac0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3ae0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3af0: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3b30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3b40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3b70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3b80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3b90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ba0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3bb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3bc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3bd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
3be0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3bf0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3c00: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3c10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3c20: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c40: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3c60: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3c80: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3c90: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
3ca0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
3cb0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
3cc0: 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  those class memb
3cd0: 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e  ers that are dyn
3ce0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f  amically.  ** mo
3cf0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f  dified during no
3d00: 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rmal operations.
3d10: 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61   The other varia
3d20: 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72  bles in this str
3d30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20  ucture.  ** are 
3d40: 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20  either constant 
3d50: 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c  throughout the l
3d60: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70  ifetime of the p
3d70: 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20  ager, or else.  
3d80: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
3d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
3da0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
3db0: 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68  ffect the way th
3dc0: 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70  e pager .  ** op
3dd0: 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  erates..  **.  *
3de0: 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61  * The 'state' va
3df0: 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69  riable is descri
3e00: 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61  bed in more deta
3e10: 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  il along with th
3e20: 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69  e.  ** descripti
3e30: 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ons of the value
3e40: 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20  s it may take - 
3e50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63  PAGER_UNLOCK etc
3e60: 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20  . Many of the.  
3e70: 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  ** other variabl
3e80: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
3e90: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69   are described i
3ea0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69  n the comment di
3eb0: 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f  rectly .  ** abo
3ec0: 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65  ve this class de
3ed0: 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  finition..  */. 
3ee0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
3f10: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
3f20: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64  , etc. */.  u8 d
3f30: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f50: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
3f60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3f70: 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  Db */.  u8 needS
3f80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3fa0: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3fb0: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3fc0: 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  al */.  u8 journ
3fd0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3ff0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
4000: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
4010: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4020: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4030: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4040: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4050: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
4060: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4080: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
4090: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
40a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
40b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
40d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
40e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
40f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
4100: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
4110: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
4120: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
4130: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
4140: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
4150: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4160: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
4170: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
4180: 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d  /.  u8 subjInMem
4190: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
41a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69  /* True to use i
41b0: 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
41c0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  rnals */.  Pgno 
41d0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4200: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
4210: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4230: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4240: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4250: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
4260: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
42a0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
42d0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
4310: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
4320: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
4330: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
4340: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
4350: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
4360: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
4370: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
4380: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
43b0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
43c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
43e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
43f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4420: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4430: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4440: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
4460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4470: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
4480: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4490: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
44a0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
44b0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
44c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
44d0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
44e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
44f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
4500: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4510: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
4520: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
4530: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
4540: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
4550: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4560: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4570: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4580: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4590: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
45a0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
45b0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
45c0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50  nal files */.  P
45d0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
45e0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
45f0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
4600: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
4610: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4630: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4640: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
4650: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4660: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4670: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4680: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4690: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
46a0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46c0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
46d0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
46e0: 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ck */..  u16 nEx
46f0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4710: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4720: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4730: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
4740: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
4750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4760: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
4770: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
4780: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
4790: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
47a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
47b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
47c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  n() */.  int pag
47d0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
47e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47f0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4800: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
4810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
4820: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
4830: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
4840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4850: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4880: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
4890: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
48a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
48b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
48c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
48d0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
48e0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
48f0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
4900: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
4910: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
4920: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4930: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
4940: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69  usyHandler */.#i
4950: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4960: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4970: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4980: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4990: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
49a0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49c0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49d0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49e0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
49f0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4a20: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4a40: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
4a50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
4a60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
4a70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
4a80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
4a90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
4aa0: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
4ab0: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
4ac0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
4ad0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
4ae0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
4af0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
4b00: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
4b10: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
4b20: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
4b30: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
4b40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b50: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
4b60: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
4b70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4b80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4b90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4ba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4bb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4bc0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
4bd0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
4be0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
4bf0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
4c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
4c10: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
4c30: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
4c40: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
4c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
4c70: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4c90: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
4ca0: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
4cb0: 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69 66  e=wal" */.#endif
4cc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4cd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4ce0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4cf0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4d00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4d10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4d20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4d30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4d40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4d50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4d60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4d70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4d90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4da0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4db0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4dc0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4dd0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4de0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4df0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4e00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4e10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4e20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4e30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4e40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4e50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4e60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4e70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
4e80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4e90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4ea0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4eb0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4ec0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
4ed0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
4ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
4ef0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
4f00: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
4f10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
4f20: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
4f30: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
4f40: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
4f50: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
4f60: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
4f70: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
4f80: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
4f90: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
4fa0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
4fb0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
4fc0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
4fd0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
4fe0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
4ff0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
5000: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
5010: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
5020: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
5030: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
5040: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
5050: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
5060: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
5070: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
5080: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
5090: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
50a0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
50b0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
50c0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
50d0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
50e0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
50f0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
5100: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
5110: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
5120: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
5130: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
5140: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
5150: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
5160: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
5170: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
5180: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
5190: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
51a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
51b0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
51c0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
51d0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
51e0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
51f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5200: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
5210: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
5220: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
5230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
5240: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
5250: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
5260: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
5270: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
5280: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
5290: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
52a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
52b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
52c0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
52d0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
52e0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
52f0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
5300: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
5310: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
5320: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
5330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
5340: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
5350: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
5360: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
5370: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
5380: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
5390: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
53a0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
53b0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
53c0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
53d0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
53e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
53f0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
5400: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
5410: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
5420: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
5430: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
5440: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
5450: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
5460: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
5470: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
5480: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
5490: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
54a0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
54b0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
54c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
54d0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
54e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
54f0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
5500: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
5510: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
5520: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
5530: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
5540: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
5550: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
5560: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5570: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5580: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5590: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
55a0: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
55b0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
55c0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
55d0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
55e0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
55f0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
5600: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
5610: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
5620: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
5630: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
5640: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
5650: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5660: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5670: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5680: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5690: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
56a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
56b0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
56c0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
56d0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
56e0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
56f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5700: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
5710: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
5720: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
5730: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
5740: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
5750: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
5760: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
5770: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
5780: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
5790: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
57a0: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
57b0: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
57c0: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
57d0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
57e0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
57f0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
5800: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
5810: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
5820: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
5830: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
5840: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
5850: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
5860: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
5870: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
5880: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
5890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
58a0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
58b0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
58c0: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
58d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
58e0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
58f0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
5900: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
5910: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
5920: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
5930: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
5940: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5950: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
5960: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
5970: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
5980: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
5990: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
59a0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
59b0: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
59c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
59d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
59e0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
59f0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
5a00: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
5a10: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
5a20: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
5a30: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
5a40: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
5a50: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
5a60: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
5a70: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
5a80: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
5a90: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
5aa0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5ab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5ac0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
5ad0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
5ae0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
5af0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
5b00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
5b10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
5b20: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
5b30: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
5b40: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
5b50: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
5b60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
5b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5b90: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
5ba0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
5bb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5bd0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
5be0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
5bf0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
5c00: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
5c10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
5c20: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
5c30: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
5c40: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
5c50: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5c60: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
5c70: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
5c80: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
5c90: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
5ca0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
5cb0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
5cc0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
5cd0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
5ce0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
5cf0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
5d00: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
5d10: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
5d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
5d30: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
5d40: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
5d50: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
5d60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5d70: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
5d80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
5d90: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
5da0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
5db0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5dc0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5dd0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5de0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5df0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5e00: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5e10: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5e20: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5e30: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5e40: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5e50: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5e60: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5e70: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5e80: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5e90: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5ea0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5eb0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5ec0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5ed0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5ee0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5ef0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5f00: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5f10: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
5f20: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
5f30: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
5f40: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
5f50: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
5f60: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
5f70: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
5f80: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
5f90: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
5fa0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
5fb0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
5fc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
5fd0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
5fe0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
5ff0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
6000: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
6010: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
6020: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
6030: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
6040: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
6050: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
6060: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
6070: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
6080: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
6090: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
60a0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
60b0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
60c0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
60d0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
60e0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
60f0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
6100: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
6110: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
6120: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
6130: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
6140: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
6150: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
6160: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
6170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
6190: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
61a0: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
61b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
61c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
61d0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
61e0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
61f0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
6200: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
6210: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
6220: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
6230: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
6240: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
6250: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
6260: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
6270: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
6280: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
6290: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
62a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
62b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
62c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
62d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
62e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
62f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
6300: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
6310: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
6320: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
6330: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
6340: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
6350: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
6360: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
6370: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
6380: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
6390: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
63a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
63b0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
63c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
63d0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
63e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
63f0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
6400: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
6410: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
6420: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
6430: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
6440: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
6450: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
6460: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
6470: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
6480: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
6490: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
64a0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
64b0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
64c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
64d0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
64e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
64f0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
6520: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
6530: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
6540: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
6550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
6560: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
6570: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
65a0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
65b0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
65c0: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
65d0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
65e0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
65f0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
6600: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
6610: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
6620: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
6630: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
6640: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
6650: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
6660: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
6670: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
6680: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
6690: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
66a0: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
66b0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
66c0: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
66d0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
66e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
66f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
6700: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
6710: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
6720: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
6730: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
6740: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
6750: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
6760: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
6770: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
6780: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
6790: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
67a0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
67b0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
67c0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
67d0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
67e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
67f0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
6800: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
6810: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
6820: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
6830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
6840: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
6850: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
6860: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
6870: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
6880: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6890: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
68a0: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
68b0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
68c0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
68d0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
68e0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
68f0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
6900: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
6910: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
6920: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
6930: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
6940: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
6950: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
6960: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
6970: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
6980: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
6990: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
69a0: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
69c0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
69d0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
69e0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
69f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6a00: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
6a10: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
6a20: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
6a30: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
6a40: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
6a50: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
6a60: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
6a70: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
6a80: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
6a90: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
6aa0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
6ab0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
6ac0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
6ad0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
6ae0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6af0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
6b00: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
6b10: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
6b20: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
6b30: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
6b40: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
6b50: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
6b60: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
6b70: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
6b80: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
6b90: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
6ba0: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
6bb0: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
6bc0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6bd0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
6be0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
6bf0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
6c00: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
6c10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6c20: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
6c30: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
6c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
6c50: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
6c60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6c70: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
6c80: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
6c90: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
6ca0: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
6cb0: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
6cc0: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
6cd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
6ce0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6cf0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
6d00: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
6d10: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
6d20: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
6d30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6d40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
6d50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
6d60: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
6d70: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
6d80: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
6d90: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
6da0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
6db0: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
6dc0: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
6dd0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
6de0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
6df0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
6e00: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
6e10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e20: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
6e30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
6e40: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
6e50: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
6e60: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
6e70: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
6e80: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
6e90: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
6ea0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
6eb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ec0: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
6ed0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
6ee0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
6ef0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6f00: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
6f10: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
6f20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
6f30: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
6f40: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
6f50: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
6f60: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
6f70: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
6f80: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
6f90: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
6fa0: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
6fb0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
6fc0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
6fd0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
6fe0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
6ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7000: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
7010: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
7020: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
7030: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
7040: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
7050: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7060: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
7070: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
7080: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
7090: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
70a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
70b0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
70c0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
70d0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
70e0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
70f0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
7100: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7120: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
7130: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
7140: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
7150: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
7160: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7170: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
71a0: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
71b0: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
71c0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71e0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
71f0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
7200: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7220: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
7230: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
7240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
7250: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
7260: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
7270: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
7280: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
7290: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
72a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
72b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
72c0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
72d0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
72e0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
72f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
7300: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
7310: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
7320: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
7330: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
7340: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
7350: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
7360: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
7370: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
7380: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
7390: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
73a0: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
73b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
73c0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
73d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
73e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
73f0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
7400: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
7410: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
7420: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
7430: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
7440: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
7450: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
7470: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
7480: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
7490: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
74a0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
74b0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
74c0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
74d0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
74e0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
74f0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
7500: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
7510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7520: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
7530: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
7540: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
7550: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
7560: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
7570: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
7580: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
7590: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
75a0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
75b0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
75c0: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
75d0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
75e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
75f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7600: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
7610: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
7620: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
7630: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
7640: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
7650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7660: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
7670: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
7680: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7690: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
76a0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
76b0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
76c0: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
76d0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
76e0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
76f0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
7720: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
7730: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
7740: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
7750: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
7760: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
7780: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
77b0: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
77c0: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
77d0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
77e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
77f0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
7800: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
7810: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
7820: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
7830: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
7840: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
7850: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
7860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7870: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
7880: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
7890: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
78a0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
78b0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
78c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
78d0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
78e0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
78f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
7900: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
7910: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
7920: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7930: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7940: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
7950: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
7960: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
7970: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
7980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
7990: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
79a0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
79b0: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
79c0: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
79d0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
79e0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
79f0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
7a00: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
7a10: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
7a20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
7a30: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
7a40: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
7a50: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
7a60: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
7a70: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
7a80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
7a90: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
7aa0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
7ab0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
7ac0: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
7ad0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
7ae0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
7af0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
7b00: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
7b10: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
7b20: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
7b30: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
7b40: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
7b50: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
7b60: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
7b70: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
7b80: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
7b90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
7ba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
7bb0: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
7bc0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
7bd0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
7be0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
7bf0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
7c00: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
7c10: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
7c20: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
7c30: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
7c40: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
7c50: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
7c60: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
7c70: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
7c80: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
7c90: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
7ca0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
7cb0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
7cc0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
7cd0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
7ce0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
7cf0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
7d00: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
7d10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d40: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7d50: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7d60: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
7d70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
7d80: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
7d90: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
7da0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7db0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
7dc0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
7dd0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
7de0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
7df0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
7e00: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
7e10: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
7e20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
7e30: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
7e40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
7e50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e60: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7e70: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
7e80: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
7e90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7ea0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7eb0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
7ec0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
7ed0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
7ee0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
7ef0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
7f00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7f10: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
7f20: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
7f30: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
7f40: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
7f50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
7f60: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
7f70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
7f80: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
7f90: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
7fa0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
7fb0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
7fc0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
7fd0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
7fe0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
7ff0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
8000: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
8010: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
8020: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
8030: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
8040: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
8050: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
8060: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
8070: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
8080: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
8090: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
80a0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
80b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
80c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
80d0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
80e0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
80f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
8100: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
8110: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
8120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8130: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
8140: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
8150: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8160: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
8170: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
8180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8190: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
81a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
81b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
81c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
81d0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
81e0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
81f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
8200: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
8210: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
8220: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
8230: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
8240: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
8250: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
8260: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
8270: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
8280: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
8290: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
82a0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
82b0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
82c0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
82d0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
82e0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
82f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
8300: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
8310: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
8320: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
8330: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
8340: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
8350: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
8360: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
8370: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
8380: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
8390: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
83a0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
83b0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
83c0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
83d0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
83e0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
83f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8400: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
8410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8420: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8430: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
8440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8450: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
8460: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
8470: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
8480: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
8490: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
84a0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
84b0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
84c0: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
84d0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
84e0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
84f0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
8500: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
8530: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
8540: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8570: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8580: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
8590: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
85a0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
85b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
85c0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
85d0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
85e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
85f0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
8600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8610: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
8620: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
8630: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
8640: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
8650: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
8660: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
8670: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
8680: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
8690: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
86a0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
86b0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
86c0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
86d0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
86e0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
86f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
8700: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8710: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
8720: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
8730: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
8740: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
8750: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8760: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
8770: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
8780: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
8790: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
87a0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
87b0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
87c0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
87d0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
87e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
87f0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
8800: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
8810: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
8820: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
8830: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
8840: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
8850: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
8860: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
8870: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
8880: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
8890: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
88a0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
88b0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
88c0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
88d0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
88e0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
88f0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
8900: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
8910: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
8920: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
8930: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
8940: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
8950: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
8960: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
8970: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
8980: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
8990: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
89a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
89b0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
89c0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
89d0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
89e0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
89f0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
8a00: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
8a10: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
8a20: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
8a30: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
8a40: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
8a50: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
8a60: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
8a70: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
8a80: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
8a90: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
8aa0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
8ab0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
8ac0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
8ad0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
8ae0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
8af0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
8b00: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
8b10: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
8b20: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
8b30: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
8b40: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
8b50: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
8b60: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
8b70: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
8b80: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
8b90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
8ba0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
8bb0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
8bc0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
8bd0: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  c );.  if( (pPag
8be0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
8bf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
8c00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8c10: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
8c20: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
8c30: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
8c40: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
8c50: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
8c60: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
8c70: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
8c80: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
8c90: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
8ca0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
8cb0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8cc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8cd0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
8ce0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
8cf0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61  .    memset(zHea
8d00: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  der, 0, sizeof(a
8d10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29  JournalMagic)+4)
8d20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
8d30: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
8d40: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
8d50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
8d60: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
8d70: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
8d80: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8d90: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
8da0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
8db0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8dc0: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
8dd0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
8de0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
8df0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
8e00: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
8e10: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
8e20: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
8e30: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
8e40: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
8e50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
8e60: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
8e70: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8e80: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8e90: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
8ea0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
8eb0: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
8ec0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
8ed0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8ee0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8ef0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
8f00: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
8f10: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
8f20: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
8f30: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
8f40: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
8f50: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
8f60: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
8f70: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
8f80: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
8f90: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
8fa0: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
8fb0: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
8fc0: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
8fd0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
8fe0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
8ff0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
9000: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
9010: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
9020: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9030: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
9040: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
9050: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9060: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
9070: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
9080: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
9090: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
90a0: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
90b0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
90c0: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
90d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
90e0: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
90f0: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
9100: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9110: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
9120: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
9130: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
9140: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
9150: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
9160: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
9170: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
9180: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
9190: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
91a0: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
91b0: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
91c0: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
91d0: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
91e0: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
91f0: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
9200: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
9210: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
9220: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
9230: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
9240: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
9250: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
9260: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
9270: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
9280: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
9290: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
92a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
92b0: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
92c0: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
92d0: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
92e0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
92f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
9300: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
9310: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
9320: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
9330: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
9340: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
9350: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
9360: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
9370: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
9380: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
9390: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
93a0: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
93b0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
93c0: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
93d0: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
93e0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
93f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
9400: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
9410: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
9420: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
9430: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9440: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
9450: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
9460: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
9470: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
9480: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
9490: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
94a0: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
94b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
94c0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
94d0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
94e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
94f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9500: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
9510: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9520: 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ff );.    pPager
9530: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9540: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
9550: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9560: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
9570: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
9580: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
9590: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
95a0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
95b0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
95c0: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
95d0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
95e0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
95f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
9600: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
9610: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9620: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
9630: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
9640: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
9650: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
9660: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
9670: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
9680: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
9690: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
96a0: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
96b0: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
96c0: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
96d0: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
96e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
96f0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
9700: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
9710: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
9720: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
9730: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
9740: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9750: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
9760: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
9770: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
9780: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
9790: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
97a0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
97b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
97c0: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
97d0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
97e0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
97f0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
9800: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
9810: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
9820: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
9830: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
9840: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
9850: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
9860: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
9870: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
9880: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
9890: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
98a0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
98b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
98c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
98d0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
98e0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
98f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
9900: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
9910: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c   */.  int isHot,
9920: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
9930: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
9940: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
9950: 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
9960: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
9970: 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20  32 *pNRec,      
9980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9990: 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
99a0: 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65  rom the nRec fie
99b0: 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62  ld */.  u32 *pDb
99c0: 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
99d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
99e0: 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64  ue of original d
99f0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65  atabase size fie
9a00: 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ld */.){.  int r
9a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9a20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9a30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69  n code */.  unsi
9a40: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
9a50: 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75  [8];     /* A bu
9a60: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
9a70: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
9a80: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75  /* Offset of jou
9ab0: 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e  rnal header bein
9ac0: 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  g read */..  ass
9ad0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
9ae0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
9af0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
9b00: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
9b10: 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  /..  /* Advance 
9b20: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
9b30: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
9b40: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
9b50: 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  . If the.  ** jo
9b60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f  urnal file is to
9b70: 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72  o small for ther
9b80: 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72  e to be a header
9b90: 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a   stored at this.
9ba0: 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75    ** point, retu
9bb0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
9bc0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
9bd0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
9be0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
9bf0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
9c00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
9c10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9c20: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
9c30: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9c40: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9c50: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
9c60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9c70: 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  f;..  /* Read in
9c80: 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74   the first 8 byt
9c90: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
9ca0: 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65  l header. If the
9cb0: 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20  y do not match. 
9cc0: 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73   ** the  magic s
9cd0: 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74  tring found at t
9ce0: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
9cf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
9d00: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
9d10: 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20  ITE_DONE. If an 
9d20: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
9d30: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
9d40: 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
9d50: 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  ,.  ** proceed..
9d60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74    */.  if( isHot
9d70: 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61   || iHdrOff!=pPa
9d80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9d90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9da0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
9db0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
9dc0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69  izeof(aMagic), i
9dd0: 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28  HdrOff);.    if(
9de0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
9df0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
9e00: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
9e10: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
9e20: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
9e30: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  c))!=0 ){.      
9e40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9e50: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
9e60: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72   /* Read the fir
9e70: 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20  st three 32-bit 
9e80: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f  fields of the jo
9e90: 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68  urnal header: Th
9ea0: 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c  e nRec.  ** fiel
9eb0: 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d  d, the checksum-
9ec0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20  initializer and 
9ed0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
9ee0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20  e at the start. 
9ef0: 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73   ** of the trans
9f00: 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61  action. Return a
9f10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
9f20: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
9f30: 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ong..  */.  if( 
9f40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
9f50: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
9f60: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9f70: 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c  +8, pNRec)).   |
9f80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9f90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9fa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9fb0: 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e  ff+12, &pPager->
9fc0: 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c  cksumInit)).   |
9fd0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9fe0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9ff0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a000: 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29  ff+16, pDbSize))
a010: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
a020: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
a030: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a040: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ff==0 ){.    u32
a050: 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20   iPageSize;     
a060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
a070: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
a080: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
a090: 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f  /.    u32 iSecto
a0a0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
a0b0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a     /* Sector-siz
a0c0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
a0d0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
a0e0: 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31 36   u16 iPageSize16
a0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a100: 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53 69   Copy of iPageSi
a110: 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61 72  ze in 16-bit var
a120: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  iable */..    /*
a130: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
a140: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
a150: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
a160: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
a170: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
a180: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
a190: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
a1a0: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
a1b0: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
a1c0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
a1d0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a1e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a1f0: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
a200: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
a210: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a220: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
a230: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
a240: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
a250: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
a260: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
a270: 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
a280: 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
a290: 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
a2a0: 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
a2b0: 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
a2c0: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
a2d0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
a2e0: 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
a2f0: 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
a300: 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
a310: 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
a320: 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
a330: 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
a340: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
a350: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
a360: 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
a370: 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
a380: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
a390: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
a3a0: 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
a3b0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
a3c0: 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
a3d0: 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
a3e0: 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
a3f0: 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
a400: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
a410: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
a420: 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
a430: 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
a440: 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
a450: 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
a460: 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
a470: 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
a480: 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
a490: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
a4a0: 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
a4b0: 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
a4c0: 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
a4d0: 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
a4e0: 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
a4f0: 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
a500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
a510: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a530: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
a540: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
a550: 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
a560: 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
a570: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a580: 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
a590: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
a5a0: 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
a5b0: 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
a5c0: 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
a5d0: 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
a5e0: 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
a5f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65      */.    iPage
a600: 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50  Size16 = (u16)iP
a610: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
a620: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
a630: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
a640: 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c 20  , &iPageSize16, 
a650: 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
a660: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
a670: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a680: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a690: 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75   iPageSize16==(u
a6a0: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
a6b0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
a6c0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a6d0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a6e0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a6f0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
a700: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
a710: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
a720: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
a730: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
a740: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
a750: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
a760: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
a770: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
a780: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
a790: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
a7a0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
a7b0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
a7c0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
a7d0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
a7e0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
a7f0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
a800: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
a810: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
a820: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
a830: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
a840: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
a850: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a860: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a870: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
a880: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
a890: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a8a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
a8b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
a8c0: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
a8d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
a8e0: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
a8f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
a900: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
a910: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
a920: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
a930: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
a940: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
a950: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
a960: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
a970: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
a980: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
a990: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
a9a0: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
a9b0: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
a9c0: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
a9d0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
a9e0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
a9f0: 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
aa00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
aa10: 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
aa20: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
aa30: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
aa40: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
aa50: 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
aa60: 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
aa70: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
aa90: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
aaa0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
aab0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
aac0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
aad0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
aae0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
aaf0: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
ab00: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
ab10: 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
ab20: 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
ab30: 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
ab40: 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
ab50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
ab60: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
ab70: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
ab80: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
ab90: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
aba0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
abb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
abc0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
abd0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
abe0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
abf0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ac00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ac30: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
ac40: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
ac50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ac60: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
ac70: 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
ac80: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
ac90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
aca0: 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
acb0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
acc0: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
acd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ace0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
acf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
ad00: 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
ad10: 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
ad20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
ad30: 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
ad40: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69   zMaster */..  i
ad50: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
ad60: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
ad70: 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
ad80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ad90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ada0: 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67  MORY .   || pPag
adb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
adc0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
add0: 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20  DE_OFF .  ){.   
ade0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
adf0: 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
ae00: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
ae10: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
ae20: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
ae30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae40: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
ae50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ae60: 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
ae70: 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
ae80: 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
ae90: 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
aea0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
aeb0: 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
aec0: 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
aed0: 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
aee0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
aef0: 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
af00: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
af10: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
af20: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
af30: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
af40: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
af50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
af60: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
af70: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
af80: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
af90: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
afa0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
afb0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
afc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
afd0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
afe0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
aff0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
b000: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
b010: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
b020: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b030: 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
b040: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b050: 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
b060: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b070: 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
b080: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b090: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
b0a0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
b0b0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
b0c0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
b0d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b0e0: 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
b0f0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
b100: 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
b110: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b120: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b130: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
b140: 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
b150: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b160: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b170: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b180: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
b190: 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
b1a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
b1b0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
b1c0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
b1d0: 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
b1e0: 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
b1f0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
b200: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
b210: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
b220: 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
b230: 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
b240: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b250: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
b260: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
b270: 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67  ster+20);.  pPag
b280: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
b290: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
b2a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
b2b0: 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
b2c0: 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
b2d0: 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
b2e0: 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
b2f0: 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
b300: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b310: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
b320: 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
b330: 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
b340: 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
b350: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
b360: 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
b370: 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
b380: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
b390: 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
b3a0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
b3b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
b3c0: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
b3d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
b3e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
b3f0: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
b400: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
b410: 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
b420: 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
b430: 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
b440: 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
b450: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
b460: 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
b470: 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
b480: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
b490: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
b4a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b4b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
b4c0: 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
b4d0: 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
b4e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
b4f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b500: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
b510: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
b520: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
b530: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b540: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
b550: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
b560: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
b570: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
b580: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
b590: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
b5a0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
b5b0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
b5c0: 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
b5d0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
b5e0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b5f0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b600: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b610: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b640: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
b650: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
b660: 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
b670: 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
b680: 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
b690: 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
b6a0: 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
b6b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
b6c0: 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
b6d0: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
b6e0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
b6f0: 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
b700: 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
b710: 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
b720: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
b730: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
b740: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b750: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
b760: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66  memory pages. If
b770: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 73  .** the pager is
b780: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b790: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
b7a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b7b0: 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20  * TODO: Why can 
b7c0: 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65  we not reset the
b7d0: 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20   pager while in 
b7e0: 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a  error state?.*/.
b7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b800: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
b810: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51  Pager){.  if( SQ
b820: 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d  LITE_OK==pPager-
b830: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b840: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
b850: 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
b860: 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ckup);.    sqlit
b870: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
b880: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
b890: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
b8a0: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
b8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b8c0: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
b8d0: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
b8e0: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
b8f0: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
b900: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
b910: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
b920: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
b930: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
b940: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
b950: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
b960: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
b970: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
b980: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
b990: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
b9a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b9b0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
b9c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
b9d0: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
b9e0: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
b9f0: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
ba00: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ba10: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ba20: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ba30: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
ba40: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ba50: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
ba60: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
ba70: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
ba80: 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
ba90: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
baa0: 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
bab0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
bac0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
bad0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
bae0: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
baf0: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
bb00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
bb10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
bb20: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
bb30: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
bb40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
bb50: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
bb60: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
bb70: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
bb80: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
bb90: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
bba0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
bbb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
bbc0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
bbd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
bbe0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
bbf0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
bc00: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
bc10: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
bc20: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
bc30: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
bc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bc60: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
bc70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
bc80: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bc90: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
bca0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
bcb0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
bcc0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
bcd0: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
bce0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
bcf0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
bd00: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
bd10: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
bd20: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
bd30: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
bd40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bd60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bd80: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
bd90: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
bda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bdb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
bdc0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
bdd0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
bde0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
bdf0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
be00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
be10: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
be20: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
be30: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
be40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
be50: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
be60: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
be70: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
be80: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
be90: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
bea0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
beb0: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
bec0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
bed0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
bee0: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
bef0: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
bf00: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
bf10: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
bf20: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
bf30: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
bf40: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
bf50: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bf60: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
bf70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
bf80: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
bf90: 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73  .** is in exclus
bfa0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ive mode..**.** 
bfb0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bfc0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
bfd0: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
bfe0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
bff0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
c000: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
c010: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
c020: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
c030: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
c040: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
c050: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
c060: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
c070: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
c080: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
c090: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
c0a0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
c0b0: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
c0c0: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
c0d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
c0e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
c0f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c100: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
c110: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
c120: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c130: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
c140: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c160: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
c170: 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
c180: 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
c190: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
c1a0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
c1b0: 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
c1c0: 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
c1d0: 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
c1e0: 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
c1f0: 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
c200: 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
c210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c220: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
c230: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
c240: 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
c250: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
c260: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
c270: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
c280: 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
c290: 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
c2a0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
c2b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
c2c0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c2d0: 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
c2e0: 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
c2f0: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
c300: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
c310: 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
c320: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
c330: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
c340: 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
c350: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
c360: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
c370: 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
c380: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
c390: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
c3a0: 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
c3b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
c3c0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
c3d0: 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
c3e0: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
c3f0: 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
c400: 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
c410: 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
c420: 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
c430: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
c440: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
c450: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c460: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
c470: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ..    sqlite3Bit
c480: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
c490: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
c4a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
c4b0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
c4c0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
c4d0: 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20  ints(pPager);.. 
c4e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
c4f0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73  e is unlocked, s
c500: 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67  omebody else mig
c510: 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68  ht change it. Th
c520: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
c530: 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
c540: 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68  dbSize etc. migh
c550: 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64  t become invalid
c560: 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   if.    ** this 
c570: 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61  happens.  One ca
c580: 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68 69  n argue that thi
c590: 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74  s doesn't need t
c5a0: 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20  o be cleared.   
c5b0: 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68   ** until the ch
c5c0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65  ange-counter che
c5d0: 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65  ck fails in Page
c5e0: 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20  rSharedLock().. 
c5f0: 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74     ** Clearing t
c600: 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 63  he page size cac
c610: 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e 67  he here is being
c620: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20   conservative.. 
c630: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
c640: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
c650: 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  0;..    if( page
c660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
c670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c680: 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
c690: 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
c6a0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
c6b0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c        rc = osUnl
c6c0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c6d0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  NO_LOCK);.    }.
c6e0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c6f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
c700: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  ode = rc;.    }.
c710: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c720: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
c730: 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er))..    /* If 
c740: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
c750: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
c760: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
c770: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
c780: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
c790: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
c7a0: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
c7b0: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
c7c0: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
c7d0: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
c7e0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
c7f0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
c800: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
c810: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c820: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
c830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c840: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
c850: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
c860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c870: 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f    }.      pager_
c880: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
c890: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
c8a0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
c8b0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
c8c0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
c8d0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61  _UNLOCK;.    pPa
c8e0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
c8f0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c900: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c910: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
c920: 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20   when an IOERR, 
c930: 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20  CORRUPT or FULL 
c940: 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76  error.** may hav
c950: 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20  e occurred. The 
c960: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
c970: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
c980: 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72  he pager .** str
c990: 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
c9a0: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
c9b0: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
c9c0: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
c9d0: 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69  r .** API functi
c9e0: 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
c9f0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
ca00: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
ca10: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74  rgument .** to t
ca20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
ca30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
ca40: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
ca50: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
ca60: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
ca70: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
ca80: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
ca90: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
caa0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
cab0: 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  t error is clear
cac0: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
cad0: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
cae0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
caf0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
cb00: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
cb10: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
cb20: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
cb30: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
cb40: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
cb50: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
cb60: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
cb70: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
cb80: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
cb90: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
cba0: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
cbb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
cbc0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
cbd0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
cbe0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
cbf0: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
cc00: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
cc10: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
cc20: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
cc30: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
cc40: 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
cc50: 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
cc60: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
cc70: 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
cc80: 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
cc90: 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
cca0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
ccb0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
ccc0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
ccd0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
cce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
ccf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
cd00: 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
cd10: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
cd20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
cd30: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
cd40: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
cd50: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
cd60: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
cd70: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
cd80: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
cd90: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
cda0: 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
cdb0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
cdc0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
cdd0: 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  de = rc;.  }.  r
cde0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cdf0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
ce00: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
ce10: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
ce20: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
ce30: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
ce40: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
ce50: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
ce60: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
ce70: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
ce80: 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
ce90: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
cea0: 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
ceb0: 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
cec0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
ced0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
cee0: 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
cef0: 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
cf00: 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
cf10: 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
cf20: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65  ase file and cle
cf30: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
cf40: 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  te. If this mean
cf50: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20  s that.** there 
cf60: 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
cf70: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
cf80: 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
cf90: 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  xt connection.**
cfa0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
cfb0: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
cfc0: 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
cfd0: 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69   be this one) wi
cfe0: 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61  ll.** roll it ba
cff0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
d000: 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
d010: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
d020: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
d030: 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
d040: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
d050: 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
d060: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
d070: 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
d080: 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
d090: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
d0a0: 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63 68  ror state. Which
d0b0: 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
d0c0: 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
d0d0: 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
d0e0: 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
d0f0: 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
d100: 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
d110: 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
d120: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d130: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
d140: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
d150: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
d160: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
d170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
d180: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
d190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d1a0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
d1b0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  r);.    sqlite3E
d1c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d1d0: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
d1e0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
d1f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d200: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
d210: 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
d220: 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
d230: 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
d240: 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
d250: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
d260: 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
d270: 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
d280: 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
d290: 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
d2a0: 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
d2b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
d2c0: 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d2e0: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
d2f0: 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
d300: 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
d310: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
d320: 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  tion..** .** If 
d330: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d340: 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20  PAGER_SHARED or 
d350: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
d360: 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
d370: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d380: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d390: 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45   (returns SQLITE
d3a0: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK)..**.** Othe
d3b0: 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
d3c0: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
d3d0: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
d3e0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
d3f0: 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
d400: 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
d410: 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
d420: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
d430: 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
d440: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
d450: 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
d460: 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
d470: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
d480: 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
d490: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
d4a0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
d4b0: 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
d4c0: 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
d4d0: 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
d4e0: 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
d4f0: 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
d500: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d510: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
d520: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
d530: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
d540: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
d550: 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
d560: 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
d570: 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
d580: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
d590: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
d5a0: 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
d5b0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
d5c0: 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
d5d0: 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
d5e0: 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
d5f0: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
d600: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
d610: 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
d620: 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
d630: 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
d640: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d650: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
d660: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
d670: 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
d680: 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
d690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d6a0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
d6b0: 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
d6c0: 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
d6d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
d6e0: 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
d6f0: 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
d700: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
d710: 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
d720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
d730: 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
d740: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
d750: 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
d760: 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
d770: 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
d780: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
d790: 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
d7a0: 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
d7b0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d7c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
d7d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
d7e0: 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
d7f0: 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
d800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d810: 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
d820: 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
d830: 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
d840: 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
d850: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
d860: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d870: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
d880: 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
d890: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d8a0: 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
d8b0: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
d8c0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
d8d0: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72   finalized, if r
d8e0: 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
d8f0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d900: 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73  e.** pager moves
d910: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
d920: 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e   state (and down
d930: 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20  grades the lock 
d940: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
d950: 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
d960: 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gly)..**.** If t
d970: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d980: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d990: 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20   mode and is in 
d9a0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
d9b0: 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20  te,.** it moves 
d9c0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
d9d0: 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65  VE. No locks are
d9e0: 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e   downgraded when
d9f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65   running in.** e
da00: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
da10: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
da20: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
da30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
da40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
da50: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
da60: 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
da70: 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
da80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
da90: 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
daa0: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
dab0: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
dac0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
dad0: 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
dae0: 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
daf0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
db00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
db10: 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
db20: 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
db30: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
db40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
db50: 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
db60: 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
db70: 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
db80: 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
db90: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
dba0: 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
dbb0: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
dbc0: 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
dbd0: 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
dbe0: 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
dbf0: 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
dc00: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dc10: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
dc20: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
dc30: 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
dc40: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
dc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc60: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dc70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
dc80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
dc90: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
dca0: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
dcb0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dcc0: 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
dcd0: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
dce0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  /..  if( pPager-
dcf0: 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
dd00: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
dd10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dd20: 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53   }.  releaseAllS
dd30: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
dd40: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  );..  assert( is
dd50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
dd60: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
dd70: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
dd80: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
dd90: 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61  r->jfd) ){.    a
dda0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
ddb0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
ddc0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
ddd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dde0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
ddf0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
de00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
de10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
de20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
de30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
de40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
de50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
de60: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
de80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
dea0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
deb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
dec0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
dee0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
def0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
df10: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
df20: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
df30: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
df40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
df50: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
df60: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
df70: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
df80: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
df90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
dfa0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
dfb0: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
dfc0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
dfd0: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
dfe0: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
dff0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
e000: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
e010: 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
e020: 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
e030: 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
e040: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
e050: 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
e060: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
e070: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
e080: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
e090: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e0a0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
e0b0: 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
e0c0: 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
e0d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
e0e0: 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
e0f0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
e100: 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
e110: 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
e120: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
e130: 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
e140: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
e150: 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
e160: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
e170: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
e180: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
e190: 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
e1a0: 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
e1b0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  y journal. .    
e1c0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
e1d0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
e1e0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e1f0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
e200: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
e210: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
e220: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
e230: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
e240: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
e250: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e270: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
e280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
e290: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
e2a0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
e2b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e2d0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e2e0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
e2f0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e300: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e310: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
e320: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
e330: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
e340: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
e350: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
e360: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
e370: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
e380: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
e390: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
e3a0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
e3b0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
e3c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
e3d0: 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  c = 0;.  sqlite3
e3e0: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
e3f0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
e400: 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
e410: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
e420: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
e430: 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
e440: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
e450: 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
e460: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
e470: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
e480: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
e490: 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ARED;..    /* If
e4a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
e4b0: 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  was in locking_m
e4c0: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
e4d0: 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
e4e0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70  ger,.    ** drop
e4f0: 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
e500: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e510: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
e520: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
e530: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
e540: 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
e550: 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
e560: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
e570: 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d 20   ){.      rc2 = 
e580: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
e590: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
e5a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
e5b0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
e5c0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
e5d0: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
e5e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
e5f0: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
e600: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e610: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
e620: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
e630: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
e640: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
e650: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
e660: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
e670: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
e680: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
e690: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
e6a0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
e6b0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
e6c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   0;.  pPager->db
e6d0: 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20  Modified = 0;.. 
e6e0: 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69   /* TODO: Is thi
e6f0: 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69  s optimal? Why i
e700: 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e  s the db size in
e710: 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a  validated here .
e720: 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61    ** when the da
e730: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
e740: 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a  ot unlocked? */.
e750: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
e760: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Size = 0;.  sqli
e770: 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
e780: 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
e790: 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
e7a0: 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  e);.  if( !MEMDB
e7b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e7c0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
e7d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
e7e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
e7f0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
e800: 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
e810: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
e820: 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
e830: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
e840: 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
e850: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
e860: 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
e870: 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
e880: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
e890: 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
e8a0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e8b0: 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
e8c0: 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
e8d0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
e8e0: 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
e8f0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
e900: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
e910: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
e920: 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
e930: 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
e940: 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
e950: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
e960: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
e970: 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
e980: 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
e990: 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
e9a0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
e9b0: 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
e9c0: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
e9d0: 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
e9e0: 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
e9f0: 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
ea00: 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
ea10: 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
ea20: 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
ea30: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
ea40: 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
ea50: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
ea60: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
ea70: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
ea80: 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
ea90: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
eaa0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
eab0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
eac0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
ead0: 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
eae0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
eaf0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
eb00: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
eb10: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
eb20: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
eb30: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
eb40: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
eb50: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
eb60: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
eb70: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
eb80: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
eb90: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
eba0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
ebb0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
ebc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
ebd0: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
ebe0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
ebf0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ec00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
ec10: 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
ec20: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
ec30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
ec40: 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
ec50: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ec60: 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
ec70: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
ec80: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
ec90: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
eca0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
ecb0: 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
ecc0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
ecd0: 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
ece0: 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
ecf0: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
ed00: 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
ed10: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
ed20: 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
ed30: 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
ed40: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
ed50: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
ed60: 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
ed70: 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
ed80: 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
ed90: 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
eda0: 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
edd0: 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
ede0: 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
edf0: 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
ee00: 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
ee10: 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
ee20: 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
ee30: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
ee40: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
ee50: 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
ee60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ee70: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
ee80: 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
ee90: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
eea0: 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
eeb0: 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
eec0: 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
eed0: 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
eee0: 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
eef0: 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
ef00: 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
ef10: 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
ef20: 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
ef30: 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
ef40: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
ef50: 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e  **.** The isMain
ef60: 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75  Jrnl flag is tru
ef70: 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
ef80: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
ef90: 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61  ournal and.** fa
efa0: 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74  lse for the stat
efb0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
efc0: 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
efd0: 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a  k journal uses.*
efe0: 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  * checksums - th
eff0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
f000: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a  nal does not..**
f010: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
f020: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
f030: 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
f040: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
f050: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
f060: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
f070: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
f080: 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
f090: 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
f0a0: 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
f0b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
f0c0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
f0d0: 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
f0e0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
f0f0: 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
f100: 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
f110: 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
f120: 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
f130: 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
f140: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
f150: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
f160: 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
f170: 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
f180: 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
f190: 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
f1a0: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
f1b0: 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
f1c0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
f1d0: 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
f1e0: 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
f1f0: 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
f200: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
f210: 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
f220: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
f230: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
f240: 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
f250: 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
f260: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
f270: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
f280: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
f290: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
f2a0: 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
f2b0: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
f2c0: 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
f2d0: 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
f2e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
f2f0: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
f300: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
f310: 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
f320: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
f330: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
f340: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
f350: 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
f360: 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
f370: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
f380: 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
f390: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
f3a0: 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
f3b0: 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
f3c0: 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
f3d0: 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
f3e0: 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
f3f0: 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
f400: 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
f410: 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
f420: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
f430: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
f440: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
f450: 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
f460: 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
f470: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
f480: 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
f490: 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
f4a0: 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
f4b0: 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
f4c0: 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
f4d0: 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
f4e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
f4f0: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
f500: 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
f510: 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
f520: 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
f530: 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
f540: 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
f550: 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
f560: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
f570: 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
f580: 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
f590: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f5a0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
f5b0: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
f5c0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f5e0: 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
f5f0: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
f600: 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
f610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f620: 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
f630: 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
f640: 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f660: 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
f670: 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
f680: 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
f690: 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
f6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
f6b0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
f6c0: 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
f6d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
f6e0: 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
f6f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
f700: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
f710: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
f720: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
f730: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
f740: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
f750: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
f760: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
f770: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
f780: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f790: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
f7a0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
f7b0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
f7e0: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
f7f0: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
f800: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
f810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f820: 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
f830: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
f840: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
f850: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
f860: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
f870: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
f880: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
f890: 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
f8c0: 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
f8d0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
f8e0: 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
f8f0: 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
f900: 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
f910: 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
f920: 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
f930: 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
f940: 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
f950: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
f960: 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
f970: 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
f980: 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
f990: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
f9a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
f9b0: 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
f9c0: 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
f9d0: 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
f9e0: 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
f9f0: 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
fa00: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
fa10: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
fa20: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
fa30: 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
fa40: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
fa50: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
fa60: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
fa70: 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
fa80: 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
fa90: 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
faa0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
fab0: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
fac0: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
fad0: 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
fae0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
faf0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
fb00: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
fb10: 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
fb20: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
fb30: 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
fb40: 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
fb50: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
fb60: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
fb70: 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
fb80: 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
fb90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fba0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
fbb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
fbc0: 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
fbd0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
fbe0: 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
fbf0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
fc00: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
fc10: 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
fc20: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
fc30: 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
fc40: 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
fc50: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
fc60: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
fc70: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
fc80: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
fc90: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
fca0: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
fcb0: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
fcc0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
fcd0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
fce0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
fcf0: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
fd00: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
fd10: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
fd20: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
fd30: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
fd40: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
fd50: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
fd60: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
fd70: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
fd80: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
fd90: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
fda0: 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
fdb0: 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
fdc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fdd0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
fde0: 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
fdf0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
fe00: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
fe10: 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
fe20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fe30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
fe40: 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
fe50: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
fe60: 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
fe70: 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
fe80: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
fe90: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
fea0: 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
feb0: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
fec0: 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
fed0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
fee0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
fef0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
ff00: 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
ff10: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ff20: 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72   played by befor
ff30: 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
ff40: 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
ff50: 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
ff60: 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
ff70: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
ff80: 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
ff90: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
ffa0: 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
ffb0: 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
ffc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
ffd0: 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
ffe0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
fff0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
10000 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
10010 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
10020 20 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70   );..  /* When p
10030 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65  laying back page
10040 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20   1, restore the 
10050 6e 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67  nReserve setting
10060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
10070 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  ==1 && pPager->n
10080 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61  Reserve!=((u8*)a
10090 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20  Data)[20] ){.   
100a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
100b0 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29  e = ((u8*)aData)
100c0 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52  [20];.    pagerR
100d0 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
100e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
100f0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10100 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
10110 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
10120 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
10130 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
10140 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
10150 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
10160 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
10170 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
10180 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
10190 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
101a0 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
101b0 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
101c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
101d0 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
101e0 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
101f0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
10200 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
10210 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
10220 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
10230 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
10240 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
10250 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
10260 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
10270 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
10280 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
10290 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
102a0 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
102b0 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
102c0 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
102d0 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
102e0 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
102f0 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
10300 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
10310 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
10320 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
10330 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
10340 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
10350 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
10360 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
10370 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
10380 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
10390 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
103a0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
103b0 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
103c0 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
103d0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
103e0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
103f0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
10400 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
10410 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
10420 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
10430 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
10440 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10450 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10460 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
10470 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
10480 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
10490 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
104a0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
104b0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
104c0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
104d0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
104e0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
104f0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
10500 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
10510 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
10520 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
10530 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
10540 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
10550 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
10560 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
10570 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
10580 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
10590 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
105a0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
105b0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
105c0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
105d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
105e0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
105f0 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
10600 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
10610 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
10620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10630 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
10640 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
10650 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
10660 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
10670 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
10680 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
10690 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
106a0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
106b0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
106c0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
106d0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
106e0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
106f0 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
10700 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
10710 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
10720 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
10730 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
10740 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
10750 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
10760 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
10770 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
10780 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
10790 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
107a0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
107b0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
107c0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
107d0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
107e0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
107f0 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
10800 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
10810 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
10820 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
10830 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
10840 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
10850 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
10860 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
10870 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61  se{.    pPg = pa
10880 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
10890 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
108a0 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
108b0 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
108c0 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
108d0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
108e0 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
108f0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
10900 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
10910 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
10920 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
10930 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
10940 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
10950 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
10960 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
10970 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
10980 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
10990 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
109a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
109b0 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
109c0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
109d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
109e0 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
109f0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
10a00 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
10a10 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
10a20 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
10a30 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
10a40 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28 70  ).   && isOpen(p
10a50 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
10a60 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
10a70 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
10a80 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
10a90 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
10aa0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
10ab0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
10ac0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
10ad0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
10ae0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
10af0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
10b00 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
10b10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10b20 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
10b30 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
10b40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
10b50 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
10b60 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
10b70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
10b80 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
10b90 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
10ba0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
10bb0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
10bc0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
10bd0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
10be0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
10bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
10c00 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
10c10 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
10c20 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
10c30 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
10c40 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
10c50 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
10c60 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
10c70 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
10c80 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
10c90 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
10ca0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
10cb0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
10cc0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
10cd0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
10ce0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
10cf0 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
10d00 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
10d10 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
10d20 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
10d30 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
10d40 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
10d50 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
10d60 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
10d70 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
10d80 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
10d90 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
10da0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
10db0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
10dc0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
10dd0 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
10de0 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
10df0 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
10e00 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
10e10 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
10e20 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
10e30 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
10e40 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
10e50 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
10e60 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
10e70 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
10e80 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
10e90 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
10ea0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
10eb0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
10ec0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
10ed0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
10ee0 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
10ef0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
10f00 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
10f10 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
10f20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
10f30 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
10f40 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
10f50 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
10f60 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
10f70 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
10f80 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
10f90 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
10fa0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
10fb0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
10fc0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
10fd0 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
10fe0 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
10ff0 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
11000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
11010 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
11020 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
11030 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
11040 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
11050 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
11060 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
11070 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
11080 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
11090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
110a0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
110b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
110c0 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
110d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
110e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
110f0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
11100 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
11110 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
11120 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
11130 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
11140 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
11150 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
11160 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
11170 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
11180 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
11190 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
111a0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
111b0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
111c0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
111d0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
111e0 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
111f0 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
11200 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
11210 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
11220 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
11230 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
11240 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
11250 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
11260 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
11270 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
11280 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
11290 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
112a0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
112b0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
112c0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
112d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
112e0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
112f0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
11300 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
11310 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
11320 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
11330 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
11340 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
11350 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
11360 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
11370 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
11380 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
11390 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
113a0 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
113b0 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
113c0 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
113d0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
113e0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
113f0 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
11400 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
11410 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
11420 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
11430 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
11440 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
11450 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
11460 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
11470 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
11480 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
11490 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
114a0 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
114b0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
114c0 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
114d0 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
114e0 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
114f0 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
11500 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
11510 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
11520 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
11530 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
11540 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
11550 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
11560 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
11570 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
11580 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
11590 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
115a0 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
115b0 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
115c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
115d0 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
115e0 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
115f0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
11600 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
11610 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
11620 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
11630 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
11640 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
11650 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
11660 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
11670 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
11680 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
11690 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
116a0 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
116b0 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
116c0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
116d0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
116e0 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
116f0 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
11700 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
11710 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
11720 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
11730 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
11740 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
11750 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
11760 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
11770 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
11780 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
11790 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
117a0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
117b0 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
117c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
117d0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
117e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
117f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
11800 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
11810 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
11820 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
11830 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
11840 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
11850 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
11860 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
11870 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
11880 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
11890 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
118a0 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
118b0 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
118c0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
118d0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
118e0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
118f0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
11900 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
11910 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
11920 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
11930 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
11940 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
11950 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
11960 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
11970 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
11980 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
11990 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
119a0 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
119b0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
119c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
119d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
119e0 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
119f0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
11a00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11a10 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
11a20 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
11a30 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
11a40 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11a50 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
11a60 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
11a70 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
11a80 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
11a90 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
11aa0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11ab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
11ac0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
11ad0 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
11ae0 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
11af0 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
11b00 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
11b10 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
11b20 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
11b30 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
11b40 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11b50 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
11b60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
11b70 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
11b80 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
11b90 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
11ba0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
11bb0 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
11bc0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
11bd0 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
11be0 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
11bf0 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
11c00 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
11c10 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
11c20 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
11c30 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
11c40 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
11c50 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11c60 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
11c70 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
11c80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
11c90 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
11ca0 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
11cb0 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
11cc0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
11cd0 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
11ce0 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
11cf0 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
11d00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
11d10 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
11d20 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
11d30 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
11d40 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
11d50 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
11d60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11d70 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
11d80 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
11d90 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
11da0 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
11db0 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
11dc0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
11dd0 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
11de0 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
11df0 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
11e00 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
11e10 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11e20 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
11e30 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
11e40 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
11e50 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
11e60 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
11e70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
11e80 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
11e90 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
11ea0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11eb0 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
11ec0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
11ed0 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
11ee0 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
11ef0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
11f00 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
11f10 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
11f20 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
11f30 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
11f40 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
11f50 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
11f60 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
11f70 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
11f80 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
11f90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
11fa0 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
11fb0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
11fc0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
11fd0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
11fe0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
11ff0 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
12000 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
12010 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
12020 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
12030 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
12040 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
12050 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
12060 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
12070 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
12080 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
12090 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
120a0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
120b0 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
120c0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
120d0 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
120e0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
120f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12100 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
12110 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
12120 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
12130 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
12140 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
12150 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
12160 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12170 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
12180 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12190 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
121a0 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
121b0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
121c0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
121d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
121e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
121f0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
12200 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
12210 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
12220 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
12230 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
12240 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
12250 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
12260 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
12270 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
12280 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
12290 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
122a0 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
122b0 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
122c0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
122d0 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
122e0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
122f0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
12300 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
12310 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
12320 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12330 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
12340 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
12350 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
12360 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
12370 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
12380 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
12390 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
123a0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
123b0 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
123c0 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
123d0 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
123e0 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
123f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
12400 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
12410 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
12420 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
12430 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
12440 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
12450 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12460 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
12470 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
12480 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
12490 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
124a0 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
124b0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
124c0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
124d0 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
124e0 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
124f0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
12500 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
12510 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12520 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
12530 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
12540 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
12550 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
12560 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
12570 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
12580 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
12590 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
125a0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
125b0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
125c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
125d0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
125e0 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
125f0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
12600 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
12610 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
12620 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
12630 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
12640 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
12650 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
12660 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
12670 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
12680 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
12690 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
126a0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
126b0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
126c0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
126d0 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
126e0 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
126f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12700 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
12710 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
12720 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12730 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
12740 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
12750 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
12760 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
12770 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
12780 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
12790 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
127a0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
127b0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
127c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
127d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
127e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
127f0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
12800 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
12810 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
12820 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
12830 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
12840 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
12850 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
12860 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
12870 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
12880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12890 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
128a0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
128b0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
128c0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
128d0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
128e0 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
128f0 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
12900 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
12910 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
12920 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
12930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12940 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
12950 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
12960 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
12970 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
12980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12990 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
129a0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
129b0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
129c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
129d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
129e0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
129f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12a00 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
12a10 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
12a20 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
12a30 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
12a40 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
12a50 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
12a60 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
12a70 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12a80 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
12a90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
12aa0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
12ab0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
12ac0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
12ad0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
12ae0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12af0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12b00 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
12b10 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
12b20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12b40 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12b50 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12b60 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
12b70 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
12b80 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
12b90 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
12ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12bb0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
12bc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12be0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12bf0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12c00 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
12c10 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
12c20 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
12c30 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
12c40 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
12c50 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
12c60 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
12c70 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
12c80 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
12c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
12ca0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
12cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12cc0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
12cd0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12ce0 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
12cf0 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
12d00 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
12d10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
12d20 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12d30 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
12d40 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
12d50 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
12d60 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
12d70 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
12d80 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
12d90 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
12da0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
12db0 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
12dc0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
12dd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12de0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
12df0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12e00 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
12e10 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
12e20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
12e30 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
12e40 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
12e50 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
12e60 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
12e70 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
12e80 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
12e90 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
12ea0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
12eb0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
12ec0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
12ed0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
12ee0 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
12ef0 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
12f00 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
12f10 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
12f20 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
12f30 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
12f40 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
12f50 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
12f60 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
12f70 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
12f80 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
12f90 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
12fa0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
12fb0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
12fc0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
12fd0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
12fe0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
12ff0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
13000 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
13010 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
13020 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
13030 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
13040 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
13050 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
13060 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
13070 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
13080 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
13090 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
130a0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
130b0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
130c0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
130d0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
130e0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
130f0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
13100 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
13110 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
13120 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
13130 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
13140 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
13150 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
13160 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
13170 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
13180 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
13190 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
131a0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
131b0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
131c0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
131d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
131e0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
131f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
13200 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
13210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13220 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
13230 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
13240 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
13250 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
13260 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
13270 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
13280 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
13290 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
132a0 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
132b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
132c0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
132d0 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
132e0 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
132f0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
13300 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
13310 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13320 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
13330 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
13340 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
13350 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
13360 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13370 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
13380 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
13390 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
133a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
133c0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
133d0 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
133e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
133f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13400 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
13410 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
13420 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
13430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13440 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13450 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
13460 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
13470 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
13480 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
13490 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
134a0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
134b0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
134c0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
134d0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
134e0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
134f0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
13500 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
13510 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
13520 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
13530 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
13540 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
13550 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
13560 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
13570 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
13580 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
13590 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
135a0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
135b0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
135c0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
135d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
135e0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
135f0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
13600 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
13610 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
13620 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
13630 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
13640 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
13650 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
13660 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
13670 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
13680 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
13690 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
136a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
136b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
136c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
136d0 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
136e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
136f0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13700 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
13710 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
13720 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13730 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
13740 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
13750 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
13760 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
13770 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
13780 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
13790 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
137a0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
137b0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
137c0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
137d0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
137e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
137f0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
13800 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
13810 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
13820 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
13830 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
13840 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  32 ){.    pPager
13850 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
13860 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  12;.  }.  if( pP
13870 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13880 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
13890 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
138a0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
138b0 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67  =512 );.    pPag
138c0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
138d0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
138e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
138f0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
13900 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
13910 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
13920 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
13930 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
13940 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
13950 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
13960 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
13970 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
13980 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
13990 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
139a0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
139b0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
139c0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
139d0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
139e0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
139f0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
13a00 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
13a10 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
13a20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
13a30 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
13a40 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
13a50 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
13a60 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
13a70 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
13a80 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
13a90 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
13aa0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
13ab0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
13ac0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
13ad0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
13ae0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
13af0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
13b00 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
13b10 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13b20 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
13b30 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
13b40 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
13b50 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
13b60 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
13b70 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
13b80 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
13b90 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
13ba0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
13bb0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
13bc0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
13bd0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
13be0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
13bf0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
13c00 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
13c10 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
13c20 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
13c30 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
13c40 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
13c50 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
13c60 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
13c70 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
13c80 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
13c90 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
13ca0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
13cb0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
13cc0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
13cd0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
13ce0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
13cf0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
13d00 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
13d10 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
13d20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
13d30 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
13d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
13d50 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13d60 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
13d70 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
13d80 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
13d90 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
13da0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
13db0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
13dc0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
13dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
13de0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
13df0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
13e00 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
13e10 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
13e20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13e30 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
13e40 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
13e50 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
13e60 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
13e70 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
13e80 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
13e90 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
13ea0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
13eb0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
13ec0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
13ed0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
13ee0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
13ef0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
13f00 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
13f10 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
13f20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
13f30 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
13f40 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13f50 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
13f60 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
13f70 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
13f80 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
13f90 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
13fa0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
13fb0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
13fc0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
13fd0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
13fe0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13ff0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
14000 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
14010 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
14020 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
14030 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
14040 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
14050 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
14060 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
14070 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
14080 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
14090 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
140a0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
140b0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
140c0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
140d0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
140e0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
140f0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
14100 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
14110 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
14120 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
14130 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
14140 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
14150 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
14160 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
14170 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
14180 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
14190 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
141a0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
141b0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
141c0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
141d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
141e0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
141f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
14200 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
14210 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
14220 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
14230 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
14240 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
14250 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
14260 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
14270 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
14280 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
14290 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
142a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
142b0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
142c0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
142d0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
142e0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
142f0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
14300 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
14310 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
14320 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14330 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
14340 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
14350 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
14360 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
14370 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
14380 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
14390 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
143a0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
143b0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
143c0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
143d0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
143e0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
143f0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
14400 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
14410 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
14420 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
14430 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
14440 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
14450 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
14460 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
14470 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
14480 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14490 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
144a0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
144b0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
144c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
144d0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
144e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
144f0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
14500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
14510 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
14520 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
14530 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
14540 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
14550 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
14560 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
14570 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14580 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
14590 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
145a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
145b0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
145c0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
145d0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
145e0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
145f0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
14600 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
14610 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
14620 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
14630 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
14640 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
14650 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
14660 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
14670 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
14680 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
14690 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
146a0 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
146b0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
146c0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
146d0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
146e0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
146f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
14700 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
14710 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
14720 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
14730 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
14740 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
14750 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
14760 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
14770 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
14780 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
14790 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
147a0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
147b0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
147c0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
147d0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
147e0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
147f0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
14800 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
14810 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
14820 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
14830 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
14840 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
14850 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
14860 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
14870 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
14880 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
14890 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
148a0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
148b0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
148c0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
148d0 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
148e0 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
148f0 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
14900 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
14910 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14920 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
14930 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
14940 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
14950 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
14960 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
14970 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
14980 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
14990 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
149a0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
149b0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
149c0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
149d0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
149e0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
149f0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
14a00 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
14a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
14a20 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
14a30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
14a40 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
14a50 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
14a60 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
14a70 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
14a80 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
14a90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
14aa0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
14ab0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
14ac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14ad0 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
14ae0 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
14af0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
14b00 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
14b10 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
14b20 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
14b30 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
14b40 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
14b50 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
14b60 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
14b70 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
14b80 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
14b90 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
14ba0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
14bb0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
14bc0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
14bd0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
14be0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
14bf0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
14c00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14c10 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
14c20 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
14c30 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
14c40 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
14c50 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
14c60 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
14c70 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
14c80 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
14c90 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
14ca0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
14cb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
14cc0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
14cd0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
14ce0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
14cf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
14d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14d20 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14d30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d50 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14d60 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14d70 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
14d80 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
14d90 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
14da0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
14db0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
14dc0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
14dd0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
14de0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
14df0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
14e00 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
14e10 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
14e20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
14e30 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
14e40 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
14e50 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
14e60 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
14e70 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
14e80 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
14e90 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
14ea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14eb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
14ec0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
14ed0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
14ee0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14ef0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
14f00 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
14f10 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
14f20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14f30 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
14f40 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
14f50 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
14f60 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
14f70 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
14f80 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
14f90 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
14fa0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
14fb0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
14fc0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
14fd0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
14fe0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
14ff0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
15000 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
15010 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
15020 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
15030 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
15040 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
15050 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
15060 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
15070 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
15080 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
15090 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
150a0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
150b0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
150c0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
150d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
150e0 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
150f0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
15100 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
15110 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
15120 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
15130 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
15140 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
15150 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
15160 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
15170 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
15180 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
15190 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
151a0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
151b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
151c0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
151d0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
151e0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
151f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
15200 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
15210 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
15220 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
15230 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
15240 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
15250 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
15260 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
15270 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
15280 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
15290 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
152a0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
152b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
152c0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
152d0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
152e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
152f0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
15300 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
15310 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
15320 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15330 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
15340 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
15350 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
15360 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
15370 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
15380 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
15390 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
153a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
153b0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
153c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
153d0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
153e0 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
153f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15410 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
15420 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
15430 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
15440 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
15450 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
15460 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
15470 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
15480 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
15490 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
154a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
154b0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
154c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
154d0 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
154e0 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
154f0 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
15500 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
15510 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
15520 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
15530 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
15540 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
15550 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
15560 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
15570 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
15580 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
155a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
155b0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
155c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
155d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
155e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
155f0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
15600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
15620 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
15630 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
15640 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15650 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
15660 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70   truncated, simp
15670 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  ly stop reading 
15680 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
15690 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
156a0 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69  journal. This mi
156b0 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68  ght happen if th
156c0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  e journal was.  
156d0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63          ** not c
156e0 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65  ompletely writte
156f0 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69  n and synced pri
15700 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20  or to a crash.  
15710 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  In that.        
15720 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64    ** case, the d
15730 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68  atabase should h
15740 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77  ave never been w
15750 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20  ritten in the.  
15760 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
15770 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20   place so it is 
15780 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61  OK to simply aba
15790 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  ndon the rollbac
157a0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
157b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
157c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
157d0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
157e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
157f0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
15800 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
15810 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
15820 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
15830 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
15840 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
15850 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
15860 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
15870 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
15880 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
15890 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
158a0 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
158b0 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
158c0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
158d0 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
158e0 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
158f0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
15900 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
15910 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
15920 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
15930 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15940 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
15950 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
15960 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
15970 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
15980 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
15990 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
159a0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
159b0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
159c0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
159d0 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
159e0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
159f0 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
15a00 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
15a10 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
15a20 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
15a30 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
15a40 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
15a50 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
15a60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
15a70 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
15a80 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
15a90 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
15aa0 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
15ab0 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
15ac0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
15ad0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
15ae0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
15af0 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
15b00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15b10 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
15b20 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
15b30 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
15b40 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
15b50 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15b60 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
15b70 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
15b80 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
15b90 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
15ba0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
15bb0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
15bc0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
15bd0 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
15be0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
15bf0 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
15c00 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
15c10 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
15c20 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
15c30 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
15c40 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
15c50 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
15c60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
15c70 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
15c80 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
15c90 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
15ca0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
15cb0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
15cc0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
15cd0 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
15ce0 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
15cf0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
15d00 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
15d10 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
15d20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
15d30 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
15d40 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
15d50 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
15d60 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
15d70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
15d80 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15d90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
15da0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
15db0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
15dc0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
15dd0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
15de0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
15df0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
15e00 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
15e10 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15e20 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
15e30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15e40 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
15e50 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
15e60 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
15e70 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
15e80 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15e90 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
15ea0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
15eb0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
15ec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
15ed0 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
15ee0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15ef0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
15f00 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15f10 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
15f20 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
15f30 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
15f40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15f50 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
15f60 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
15f70 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
15f80 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
15f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15fb0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
15fc0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
15fd0 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
15fe0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
15ff0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
16000 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
16010 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
16020 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
16030 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
16040 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
16050 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
16060 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
16070 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
16080 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
16090 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
160a0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
160b0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
160c0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
160d0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
160e0 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
160f0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
16100 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
16110 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
16120 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
16130 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
16140 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
16150 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
16160 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
16170 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
16180 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
16190 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
161a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
161b0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
161c0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
161d0 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
161e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
161f0 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  and into .** pPg
16200 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
16210 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
16220 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
16230 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
16240 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
16250 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
16260 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
16270 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
16280 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
16290 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
162a0 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
162b0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
162c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
162d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
162e0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
162f0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
16300 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
16310 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
16320 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
16330 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16340 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
16350 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
16360 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
16370 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16380 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
16390 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
163a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
163b0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
163c0 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
163d0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
163e0 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
163f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
16400 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
16410 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
16420 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c  */.  int isInWal
16430 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16440 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67    /* True if pag
16450 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65  e is in log file
16460 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
16470 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16480 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
16490 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
164a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
164b0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
164c0 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44  _SHARED && !MEMD
164d0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
164e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
164f0 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
16500 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  R(!isOpen(pPager
16510 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73  ->fd)) ){.    as
16520 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
16530 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65  mpFile );.    me
16540 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
16550 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
16560 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Size);.    retur
16570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16580 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
16590 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
165a0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
165b0 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
165c0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
165d0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
165e0 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28   sqlite3WalRead(
165f0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
16600 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67  no, &isInWal, pg
16610 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
16620 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16630 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49  QLITE_OK && !isI
16640 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20  nWal ){.    i64 
16650 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
16660 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16670 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
16680 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
16690 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
166a0 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
166b0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
166c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
166d0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
166e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
166f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
16700 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
16710 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
16720 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16730 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
16740 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
16750 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
16760 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
16770 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
16780 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
16790 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
167a0 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
167b0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
167c0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
167d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
167e0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
167f0 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
16800 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
16810 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
16820 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
16830 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
16840 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
16850 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
16860 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
16870 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
16880 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
16890 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
168a0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
168b0 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
168c0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
168d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
168e0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
168f0 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
16900 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
16910 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
16920 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
16930 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
16940 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
16950 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
16960 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
16970 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
16980 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
16990 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
169a0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
169b0 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
169c0 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
169d0 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
169e0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
169f0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
16a00 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
16a10 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
16a20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16a30 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
16a40 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
16a50 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
16a60 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
16a70 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
16a80 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
16a90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
16aa0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
16ab0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
16ac0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
16ad0 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
16ae0 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
16af0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
16b00 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
16b10 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
16b20 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
16b30 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
16b40 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
16b50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
16b60 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
16b70 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
16b80 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
16b90 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
16ba0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
16bb0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
16bc0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
16bd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
16be0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
16bf0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
16c00 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
16c10 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
16c20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
16c30 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
16c40 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16c50 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
16c60 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
16c70 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
16c80 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
16c90 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
16ca0 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
16cb0 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
16cc0 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
16cd0 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
16ce0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
16cf0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
16d00 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
16d10 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
16d20 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
16d30 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
16d40 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
16d50 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
16d60 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
16d70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
16d80 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
16d90 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
16da0 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
16db0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
16dc0 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
16dd0 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
16de0 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
16df0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
16e00 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
16e10 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
16e20 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
16e30 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
16e40 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
16e50 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
16e60 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
16e70 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
16e80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16e90 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
16ea0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
16eb0 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
16ec0 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20   *pPg;..  pPg = 
16ed0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
16ee0 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
16ef0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
16f00 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
16f10 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
16f20 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
16f30 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
16f40 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
16f50 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
16f60 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
16f70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16f90 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
16fa0 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
16fb0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16fc0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
16fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16fe0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
16ff0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
17000 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
17010 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
17020 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
17030 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
17040 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
17050 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
17060 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
17070 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
17080 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
17090 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
170a0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
170b0 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
170c0 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
170d0 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
170e0 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
170f0 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
17100 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
17110 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
17120 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
17130 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
17140 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
17150 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
17160 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
17170 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
17180 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
17190 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
171a0 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
171b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
171c0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
171d0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
171e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
171f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17200 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
17210 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
17220 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
17230 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
17240 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
17250 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
17260 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17270 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17290 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
172a0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
172d0 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
172e0 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
172f0 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
17300 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
17310 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
17320 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
17330 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
17340 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
17350 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
17360 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
17370 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
17380 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
17390 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
173a0 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
173b0 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
173c0 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
173d0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
173e0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
173f0 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
17400 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
17410 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
17420 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
17430 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
17440 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
17450 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
17460 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
17470 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
17480 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
17490 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
174a0 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
174b0 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
174c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
174d0 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
174e0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
174f0 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
17500 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
17510 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
17520 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
17530 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
17540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17550 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17560 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
17570 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
17580 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
17590 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
175a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
175b0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
175c0 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
175d0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
175e0 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
175f0 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
17600 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
17610 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
17620 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
17630 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
17640 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
17650 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
17660 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
17690 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
176a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
176b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
176c0 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
176d0 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
176e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
176f0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
17700 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
17710 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
17720 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20  sCommit,        
17730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17740 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
17750 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17760 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20  sync_flags      
17770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17780 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
17790 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20  OsSync() (or 0) 
177a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
177d0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
177e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
177f0 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  l );.  rc = sqli
17800 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
17810 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
17820 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17830 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
17840 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
17850 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a  sync_flags.  );.
17860 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17870 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
17880 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
17890 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
178a0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
178b0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
178c0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
178d0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
178e0 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
178f0 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
17900 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17910 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
17920 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
17930 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
17940 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
17950 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
17960 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
17970 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
17980 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
17990 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
179a0 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
179b0 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
179c0 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
179d0 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
179e0 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
179f0 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
17a00 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
17a10 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
17a20 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
17a30 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
17a40 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
17a50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17a60 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
17a70 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
17a80 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17a90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ab0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
17ac0 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
17ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17ae0 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
17af0 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
17b00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
17b10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17b20 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  ) );..  /* sqlit
17b30 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
17b40 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
17b50 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
17b60 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
17b70 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
17b80 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
17b90 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
17ba0 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
17bb0 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
17bc0 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
17bd0 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
17be0 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
17bf0 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
17c00 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
17c10 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
17c20 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
17c30 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
17c40 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
17c50 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
17c60 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
17c70 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
17c80 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
17c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17ca0 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b  {.    int dummy;
17cb0 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 64  .    if( changed
17cc0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
17cd0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17ce0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17cf0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
17d00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
17d10 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lid==0 );.    }.
17d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17d30 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17d40 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a  Pager, &dummy);.
17d50 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
17d60 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
17d70 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ED;..  return rc
17d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
17d90 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 65 6e   for the existen
17da0 63 65 20 6f 66 20 6f 72 20 64 65 6c 65 74 65 20  ce of or delete 
17db0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
17dc0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
17dd0 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
17de0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
17df0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ger..**.** When 
17e00 70 45 78 69 73 74 73 21 3d 4e 55 4c 4c 2c 20 73  pExists!=NULL, s
17e10 65 74 20 2a 70 45 78 69 73 74 73 20 74 6f 20 31  et *pExists to 1
17e20 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
17e30 6c 65 20 65 78 69 73 74 73 2c 20 6f 72 20 30 0a  le exists, or 0.
17e40 2a 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ** if the *-wal 
17e50 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
17e60 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ist..**.** When 
17e70 70 45 78 69 73 74 73 3d 3d 4e 55 4c 4c 2c 20 64  pExists==NULL, d
17e80 65 6c 65 74 65 20 74 68 65 20 2a 2d 77 61 6c 20  elete the *-wal 
17e90 66 69 6c 65 20 69 66 20 69 74 20 65 78 69 73 74  file if it exist
17ea0 73 2c 20 6f 72 20 74 68 65 20 64 6f 0a 2a 2a 20  s, or the do.** 
17eb0 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 2a  nothing if the *
17ec0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  -wal file does n
17ed0 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ot exist..**.** 
17ee0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17ef0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 49 66 20   on success. If 
17f00 6f 6e 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20  on an IO or OOM 
17f10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17f20 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  turn.** an SQLit
17f30 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
17f40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17f50 72 43 68 65 63 6b 46 6f 72 4f 72 44 65 6c 65 74  rCheckForOrDelet
17f60 65 57 41 4c 28 50 61 67 65 72 20 2a 70 50 61 67  eWAL(Pager *pPag
17f70 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
17f80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
17fb0 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
17fc0 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
17fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17fe0 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   of the WAL file
17ff0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
18000 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
18010 20 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c   );.  zWal = sql
18020 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
18030 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e 7a  -wal", pPager->z
18040 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
18050 20 21 7a 57 61 6c 20 29 7b 0a 20 20 20 20 72 63   !zWal ){.    rc
18060 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
18080 28 20 70 45 78 69 73 74 73 20 29 7b 0a 20 20 20  ( pExists ){.   
18090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
180a0 73 41 63 63 65 73 73 28 70 50 61 67 65 72 2d 3e  sAccess(pPager->
180b0 70 56 66 73 2c 20 7a 57 61 6c 2c 20 53 51 4c 49  pVfs, zWal, SQLI
180c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
180d0 2c 20 70 45 78 69 73 74 73 29 3b 0a 20 20 20 20  , pExists);.    
180e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
180f0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
18100 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
18110 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  zWal, 0);.    }.
18120 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18130 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  (zWal);.  }.  re
18140 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18150 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
18160 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
18170 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
18180 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
18190 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
181a0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
181b0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
181c0 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
181d0 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
181e0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
181f0 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
18200 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
18210 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
18220 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
18230 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
18240 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
18250 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
18260 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
18270 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
18280 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
18290 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
182a0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
182b0 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
182c0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
182d0 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
182e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
182f0 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
18300 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
18310 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
18320 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
18330 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
18340 2a 2a 20 49 66 20 74 68 65 20 57 41 4c 20 66 69  ** If the WAL fi
18350 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 61 6c  le is opened, al
18360 73 6f 20 6f 70 65 6e 20 61 20 73 6e 61 70 73 68  so open a snapsh
18370 6f 74 20 28 72 65 61 64 20 74 72 61 6e 73 61 63  ot (read transac
18380 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tion)..**.** The
18390 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
183a0 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
183b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
183c0 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
183d0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
183e0 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
183f0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
18400 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
18410 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
18420 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
18430 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
18440 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
18450 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
18460 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
18470 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
18480 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
18490 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
184a0 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
184b0 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
184c0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
184d0 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
184e0 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
184f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
18500 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18510 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
18520 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
18530 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18550 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
18560 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
18570 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18590 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
185a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
185b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
185c0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
185d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  _LOCK );.    rc 
185e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
185f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
18600 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
18610 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18620 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
18630 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
18640 70 61 67 65 72 43 68 65 63 6b 46 6f 72 4f 72 44  pagerCheckForOrD
18650 65 6c 65 74 65 57 41 4c 28 70 50 61 67 65 72 2c  eleteWAL(pPager,
18660 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c   0);.      isWal
18670 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
18680 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
18690 72 43 68 65 63 6b 46 6f 72 4f 72 44 65 6c 65 74  rCheckForOrDelet
186a0 65 57 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73  eWAL(pPager, &is
186b0 57 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Wal);.    }.    
186c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
186d0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
186e0 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
186f0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
18700 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
18710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18720 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
18730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18750 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18760 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
18770 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
18780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18790 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
187a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
187b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
187c0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
187d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
187e0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
187f0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
18800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18810 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18820 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18830 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
18840 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
18850 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
18860 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
18870 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
18880 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18890 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
188a0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
188b0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
188c0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
188d0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
188e0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
188f0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
18900 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
18910 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
18920 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
18930 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
18940 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
18950 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
18960 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
18970 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
18980 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
18990 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
189a0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
189b0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
189c0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
189d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
189e0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
189f0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
18a00 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
18a10 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
18a20 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
18a30 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
18a40 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
18a50 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
18a60 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
18a70 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
18a80 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18a90 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
18aa0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
18ab0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
18ac0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
18ad0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
18ae0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
18af0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
18b00 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
18b10 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18b20 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18b30 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18b40 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18b50 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18b60 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18b70 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
18b80 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18b90 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
18ba0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
18bb0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
18bc0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
18bd0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
18be0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
18bf0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
18c00 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
18c10 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18c20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18c30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18c40 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18c50 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18c60 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
18c70 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
18c80 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
18c90 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
18ca0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
18cb0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
18cc0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
18cd0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
18ce0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
18cf0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
18d00 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
18d10 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18d20 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18d30 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18d40 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18d50 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18d60 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18d70 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
18d80 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
18d90 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
18da0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
18db0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
18dc0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
18dd0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
18de0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
18df0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
18e00 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
18e10 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18e20 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18e30 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18e40 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18e50 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18e60 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18e70 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
18e80 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
18e90 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
18ea0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18eb0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
18ec0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
18ed0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
18ee0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
18ef0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
18f00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
18f10 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18f20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18f30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18f40 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18f50 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18f60 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18f70 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
18f80 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
18f90 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
18fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
18fb0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
18fc0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
18fd0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
18fe0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18ff0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
19000 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
19010 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
19020 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
19030 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
19040 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
19050 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
19060 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19070 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
19080 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
19090 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
190a0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
190b0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
190c0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
190d0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
190e0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
190f0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
19100 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
19110 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
19120 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
19130 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
19140 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19150 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
19160 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
19170 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
19180 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
19190 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
191a0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
191b0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
191c0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
191d0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
191e0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
191f0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
19200 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
19210 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
19220 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
19230 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
19240 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
19250 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
19260 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
19270 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
19280 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
19290 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
192a0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
192b0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
192c0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
192d0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
192e0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
192f0 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
19300 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
19310 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
19320 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
19330 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
19340 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
19350 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
19360 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
19370 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
19380 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
19390 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
193a0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
193b0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
193c0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
193d0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
193e0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
193f0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
19400 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
19410 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
19420 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
19430 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
19440 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
19450 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
19460 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
19470 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
19480 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
19490 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
194a0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
194b0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
194c0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
194d0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
194e0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
194f0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
19500 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
19510 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
19520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
19530 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
19540 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
19550 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
19560 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
19570 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
19580 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
19590 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
195a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
195b0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
195c0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
195d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
195e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
195f0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
19600 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19610 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19620 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19630 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19640 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19650 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19660 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19690 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
196a0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
196b0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
196c0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
196d0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
196e0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
196f0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
19700 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
19710 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
19720 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
19730 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
19740 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
19750 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
19760 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
19770 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
19780 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
19790 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
197a0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
197b0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
197c0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
197d0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
197e0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
197f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19800 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
19810 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
19820 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
19830 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
19840 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
19850 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
19860 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
19870 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
19880 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
19890 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
198a0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
198b0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
198c0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
198d0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
198e0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
198f0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
19900 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
19910 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
19920 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
19930 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
19940 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
19950 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
19960 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19970 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
19980 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
19990 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
199a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
199b0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
199c0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
199d0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
199e0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
199f0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
19a00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
19a10 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19a20 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
19a30 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
19a40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
19a50 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
19a60 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
19a70 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
19a80 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
19a90 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
19aa0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
19ab0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
19ac0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
19ad0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19ae0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
19af0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19b00 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19b10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
19b20 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19b30 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19b40 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19b50 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19b60 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
19b70 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
19b80 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
19b90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
19ba0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
19bb0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
19bc0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
19bd0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
19be0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
19bf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
19c00 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
19c10 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19c20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19c30 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19c40 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19c50 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19c60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19c70 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
19c80 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
19c90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19ca0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
19cb0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
19cc0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
19cd0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
19ce0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
19cf0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
19d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
19d10 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19d20 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19d30 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19d40 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19d50 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19d60 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19d70 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
19d80 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
19d90 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
19da0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19db0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19dc0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
19dd0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
19de0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
19df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19e00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19e10 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19e30 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19e40 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19e50 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19e60 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19e70 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
19e80 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
19e90 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
19ea0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
19eb0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
19ec0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
19ed0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
19ee0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
19ef0 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
19f00 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
19f10 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19f20 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19f30 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19f40 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19f50 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19f60 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19f70 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
19f80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
19f90 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
19fa0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
19fb0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
19fc0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
19fd0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
19fe0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
19ff0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
1a000 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
1a010 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
1a020 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
1a030 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
1a040 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
1a050 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
1a060 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
1a070 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
1a080 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
1a090 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
1a0a0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
1a0b0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
1a0c0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
1a0d0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
1a0e0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
1a0f0 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
1a100 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
1a110 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
1a120 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
1a130 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
1a140 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a150 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
1a160 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
1a170 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
1a180 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1a190 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
1a1a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
1a1b0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
1a1c0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
1a1d0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
1a1e0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
1a1f0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
1a200 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1a210 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
1a220 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1a230 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
1a240 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
1a250 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
1a260 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
1a270 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
1a280 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
1a290 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
1a2a0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
1a2b0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
1a2c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a2d0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1a2e0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
1a2f0 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
1a300 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
1a310 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
1a320 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1a330 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
1a340 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
1a350 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
1a360 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
1a370 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
1a380 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
1a390 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
1a3a0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
1a3b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a3c0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
1a3d0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
1a3e0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
1a3f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1a400 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
1a410 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
1a420 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
1a430 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
1a440 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
1a450 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
1a460 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
1a470 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
1a480 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a490 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
1a4a0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
1a4b0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
1a4c0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
1a4d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
1a4e0 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
1a4f0 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
1a500 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
1a510 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
1a520 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
1a530 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
1a540 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
1a550 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1a560 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
1a570 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1a580 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
1a590 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
1a5a0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
1a5b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1a5c0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
1a5d0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
1a5e0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
1a5f0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
1a600 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a610 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1a620 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
1a630 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1a640 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
1a650 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
1a660 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1a670 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
1a680 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
1a690 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1a6a0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
1a6b0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a6c0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
1a6d0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
1a6e0 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
1a6f0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1a700 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
1a710 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
1a720 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
1a730 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
1a740 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
1a750 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
1a760 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
1a770 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
1a780 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1a790 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1a7a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a7b0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a7c0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
1a7d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1a7e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
1a7f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a800 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
1a810 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1a820 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
1a830 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
1a840 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
1a850 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
1a860 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
1a870 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
1a880 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
1a890 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1a8a0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
1a8b0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1a8c0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
1a8d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a8f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1a900 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a910 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
1a920 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
1a930 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
1a940 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a950 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
1a960 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
1a970 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a980 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a990 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1a9a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a9b0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
1a9c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a9d0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
1a9e0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a9f0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
1aa00 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
1aa10 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1aa20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1aa30 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
1aa40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1aa50 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1aa60 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
1aa70 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1aa80 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
1aa90 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1aaa0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
1aab0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
1aac0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1aad0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1aae0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1aaf0 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1ab00 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1ab10 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1ab20 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1ab30 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1ab40 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1ab50 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1ab60 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1ab70 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1ab80 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1ab90 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1aba0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1abb0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1abc0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1abd0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1abe0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1abf0 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1ac00 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1ac10 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1ac20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1ac30 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1ac40 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1ac50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1ac80 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1ac90 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1aca0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1acb0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1acc0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1acd0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1ace0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1acf0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1ad00 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1ad10 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1ad20 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1ad30 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1ad40 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1ad50 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1ad60 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1ad70 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1ad80 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1ad90 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1ada0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1adb0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1adc0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1add0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1ade0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1adf0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1ae00 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1ae10 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae30 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1ae40 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1ae50 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1ae60 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1ae70 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1ae80 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1ae90 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1aea0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1aeb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1aec0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1aed0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1aee0 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1aef0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1af00 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1af10 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1af20 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1af30 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1af40 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
1af50 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
1af60 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
1af70 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
1af80 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
1af90 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
1afa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1afb0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
1afc0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
1afd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1afe0 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
1aff0 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
1b000 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
1b010 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
1b020 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
1b030 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
1b040 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
1b050 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49  _CORRUPT or SQLI
1b060 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
1b070 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
1b080 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1b090 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1b0a0 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
1b0b0 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
1b0c0 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
1b0d0 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
1b0e0 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
1b0f0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
1b100 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
1b110 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
1b120 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
1b130 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
1b140 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
1b150 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
1b160 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
1b170 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
1b180 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
1b190 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
1b1a0 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
1b1b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
1b1c0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
1b1d0 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
1b1e0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
1b1f0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
1b200 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
1b210 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
1b220 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
1b230 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
1b240 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
1b250 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
1b260 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
1b270 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
1b280 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
1b290 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
1b2a0 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
1b2b0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
1b2c0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
1b2d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1b2e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
1b2f0 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
1b300 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
1b310 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
1b320 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b330 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1b340 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
1b350 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
1b360 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
1b370 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
1b380 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
1b390 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
1b3a0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
1b3b0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
1b3c0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1b3d0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
1b3e0 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
1b3f0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
1b400 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
1b410 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
1b420 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
1b430 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
1b440 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
1b450 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
1b460 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1b470 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
1b480 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61  pPager, u16 *pPa
1b490 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
1b4a0 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
1b4b0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1b4c0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1b4d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
1b4e0 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
1b4f0 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  PageSize;.    as
1b500 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
1b510 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
1b520 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
1b530 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
1b540 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66  _SIZE) );.    if
1b550 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
1b560 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
1b570 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26  bSize==0).     &
1b580 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
1b590 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
1b5a0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
1b5b0 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
1b5c0 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
1b5d0 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
1b5e0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1b5f0 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
1b600 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
1b610 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
1b620 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
1b630 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b640 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1b650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1b660 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1b670 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
1b680 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
1b690 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
1b6a0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
1b6b0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
1b6c0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ce);.        pPa
1b6d0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
1b6e0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73   pNew;.        s
1b6f0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
1b700 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
1b710 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
1b720 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1b730 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65  }.    *pPageSize
1b740 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
1b750 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66  pageSize;.    if
1b760 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
1b770 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
1b780 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
1b790 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
1b7a0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
1b7b0 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
1b7c0 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
1b7d0 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
1b7e0 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
1b7f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
1b800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b810 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1b820 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
1b830 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
1b840 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
1b850 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
1b860 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
1b870 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
1b880 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
1b890 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
1b8a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
1b8b0 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
1b8c0 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
1b8d0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
1b8e0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
1b8f0 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
1b900 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
1b910 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
1b920 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
1b930 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
1b940 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
1b950 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
1b960 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
1b970 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
1b980 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
1b990 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
1b9a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1b9b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
1b9c0 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
1b9d0 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
1b9e0 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
1b9f0 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
1ba00 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
1ba10 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
1ba20 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
1ba30 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
1ba40 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
1ba50 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
1ba60 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
1ba70 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
1ba80 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
1ba90 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
1baa0 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
1bab0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
1bac0 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
1bad0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
1bae0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1baf0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
1bb00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1bb10 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
1bb20 74 20 6e 50 61 67 65 3b 0a 20 20 69 66 28 20 6d  t nPage;.  if( m
1bb30 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70  xPage>0 ){.    p
1bb40 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1bb50 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66  mxPage;.  }.  if
1bb60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1bb70 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1bb80 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1bb90 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1bba0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1bbb0 61 73 73 65 72 74 28 20 28 69 6e 74 29 70 50 61  assert( (int)pPa
1bbc0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61  ger->mxPgno>=nPa
1bbd0 67 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ge );.  }.  retu
1bbe0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
1bbf0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
1bc00 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
1bc10 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
1bc20 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
1bc30 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
1bc40 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
1bc50 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
1bc60 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
1bc70 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
1bc80 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
1bc90 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
1bca0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
1bcb0 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
1bcc0 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
1bcd0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
1bce0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
1bcf0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
1bd00 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
1bd10 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
1bd20 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
1bd30 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
1bd40 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
1bd50 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1bd60 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
1bd70 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
1bd80 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
1bd90 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
1bda0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
1bdb0 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
1bdc0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
1bdd0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
1bde0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
1bdf0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
1be00 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
1be10 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
1be20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
1be30 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
1be40 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
1be50 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
1be60 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1be70 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
1be80 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
1be90 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
1bea0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
1beb0 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
1bec0 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
1bed0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
1bee0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
1bef0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
1bf00 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
1bf10 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
1bf20 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
1bf30 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
1bf40 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
1bf50 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
1bf60 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
1bf70 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
1bf80 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
1bf90 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
1bfa0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1bfb0 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
1bfc0 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
1bfd0 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
1bfe0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1bff0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
1c000 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
1c010 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
1c020 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
1c030 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
1c040 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
1c050 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
1c060 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
1c070 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
1c080 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
1c090 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
1c0a0 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
1c0b0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
1c0c0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1c0d0 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
1c0e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
1c0f0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
1c100 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
1c110 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
1c120 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
1c130 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1c140 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
1c150 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
1c160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c170 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
1c180 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
1c190 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c1a0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1c1b0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
1c1c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1c1d0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
1c1e0 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
1c1f0 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
1c200 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
1c210 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
1c220 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
1c230 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
1c240 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
1c250 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
1c260 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
1c270 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1c280 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
1c290 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c2a0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
1c2b0 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
1c2c0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
1c2d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c2e0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1c2f0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
1c300 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c310 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1c320 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1c330 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c340 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c350 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1c360 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
1c370 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1c380 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c390 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ile associated .
1c3a0 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20  ** with pPager. 
1c3b0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
1c3c0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  s calculated as 
1c3d0 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f  (<db file size>/
1c3e0 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a  <page-size>)..**
1c3f0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
1c400 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
1c410 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
1c420 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
1c430 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
1c440 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
1c450 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a  1 page file..**.
1c460 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1c470 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  is in error stat
1c480 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
1c490 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1c4a0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f  then the.** erro
1c4b0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
1c4c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1c4d0 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20  nd *pnPage left 
1c4e0 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a  unchanged. Or,.*
1c4f0 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79  * if the file sy
1c500 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71  stem has to be q
1c510 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73  ueried for the s
1c520 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1c530 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79  and.** the query
1c540 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73   attempt returns
1c550 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68   an IO error, th
1c560 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
1c570 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
1c580 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1c590 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
1c5a0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1c5b0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1c5c0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e  successful, then
1c5d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c5e0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
1c5f0 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  nPage is set to 
1c600 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c610 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1c620 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
1c630 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1c640 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1c650 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
1c660 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
1c670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1c680 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1c690 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1c6a0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
1c6b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1c6c0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53 74   in the file. St
1c6d0 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61 67  ore this in nPag
1c6e0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
1c6f0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
1c700 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  ){.    nPage = p
1c710 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1c720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c730 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1c740 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 74      /* Error ret
1c750 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
1c760 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36 34  ize() */.    i64
1c770 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1c780 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a       /* File siz
1c790 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75 72  e in bytes retur
1c7a0 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a  ned by OsFileSiz
1c7b0 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  e() */..    if( 
1c7c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1c7d0 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 73  er) && pPager->s
1c7e0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1c7f0 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK ){.      sqli
1c800 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1c810 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61 67  ger->pWal, &nPag
1c820 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1c830 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1c840 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
1c850 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1c860 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1c870 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ile );.      if(
1c880 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c890 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
1c8a0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
1c8b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1c8c0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1c8d0 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20 20  , &n)) ){.      
1c8e0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
1c8f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1c900 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e    }.      if( n>
1c930 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
1c940 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
1c950 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
1c960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c970 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
1c980 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
1c990 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
1c9a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c9b0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1c9c0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1c9d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c9e0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
1c9f0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1ca00 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1ca10 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1ca20 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  zeValid = 1;.   
1ca30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1ca40 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1ca50 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1ca60 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1ca70 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
1ca80 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
1ca90 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
1caa0 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
1cab0 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
1cac0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
1cad0 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
1cae0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1caf0 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
1cb00 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1cb10 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
1cb20 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Page;.  }..  /* 
1cb30 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1cb40 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74 75  ariable and retu
1cb50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a  rn SQLITE_OK */.
1cb60 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1cb70 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1cb80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1cb90 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
1cba0 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
1cbb0 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
1cbc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
1cbd0 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
1cbe0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
1cbf0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
1cc00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1cc10 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
1cc20 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
1cc30 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
1cc40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
1cc50 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
1cc60 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
1cc70 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
1cc80 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
1cc90 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
1cca0 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
1ccb0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
1ccc0 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
1ccd0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
1cce0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
1ccf0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
1cd00 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
1cd10 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
1cd20 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
1cd30 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1cd40 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
1cd50 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1cd60 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
1cd70 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
1cd80 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
1cd90 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
1cda0 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
1cdb0 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
1cdc0 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
1cdd0 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
1cde0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1cdf0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
1ce00 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
1ce10 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
1ce20 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ce50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1ce60 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
1ce70 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
1ce80 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
1ce90 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
1cea0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
1ceb0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
1cec0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
1ced0 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
1cee0 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
1cef0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1cf00 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
1cf10 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1cf20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1cf30 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
1cf40 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
1cf50 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
1cf60 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a   unknown. It.  *
1cf70 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  * must not have 
1cf80 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74  been modified at
1cf90 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
1cfa0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1cfb0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1cfc0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
1cfd0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
1cfe0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1cff0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1d000 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
1d010 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1d020 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
1d030 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
1d040 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
1d050 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
1d060 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
1d070 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
1d080 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
1d090 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
1d0a0 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
1d0b0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
1d0c0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
1d0d0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1d0e0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
1d0f0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
1d100 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
1d110 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d120 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
1d130 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
1d140 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61   || (pPager->sta
1d150 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1d160 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
1d170 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
1d180 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
1d190 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
1d1a0 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65  RVED && locktype
1d1b0 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ==PAGER_EXCLUSIV
1d1c0 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  E).  );..  if( p
1d1d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
1d1e0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
1d1f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d200 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
1d210 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d220 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1d230 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
1d240 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
1d250 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1d260 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
1d270 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
1d280 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
1d290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d2a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1d2b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28  Pager->state = (
1d2c0 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  u8)locktype;.   
1d2d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
1d2e0 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
1d2f0 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
1d300 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d310 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
1d320 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
1d330 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1d340 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
1d350 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
1d360 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
1d370 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
1d380 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
1d390 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
1d3a0 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
1d3b0 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
1d3c0 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
1d3d0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
1d3e0 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
1d3f0 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
1d400 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
1d410 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
1d420 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
1d430 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
1d440 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
1d450 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
1d460 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
1d470 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
1d480 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
1d490 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
1d4a0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
1d4b0 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
1d4c0 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
1d4d0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
1d4e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
1d4f0 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
1d500 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1d510 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
1d520 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
1d530 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
1d540 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
1d550 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
1d560 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
1d570 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
1d580 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
1d590 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
1d5a0 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
1d5b0 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
1d5c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1d5d0 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
1d5e0 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
1d5f0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
1d600 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
1d610 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
1d620 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20  aviour would be 
1d630 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
1d640 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
1d650 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
1d660 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
1d670 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
1d680 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
1d690 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
1d6a0 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
1d6b0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
1d6c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1d6d0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
1d6e0 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
1d6f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
1d700 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
1d710 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
1d720 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
1d730 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
1d740 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
1d750 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
1d760 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
1d770 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
1d780 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
1d790 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1d7a0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
1d7b0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1d7c0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
1d7d0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
1d7e0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1d7f0 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
1d800 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
1d810 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
1d820 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
1d830 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
1d840 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
1d850 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1d860 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
1d870 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
1d880 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
1d890 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
1d8a0 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
1d8b0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
1d8c0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1d8d0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
1d8e0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
1d8f0 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
1d900 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
1d910 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1d920 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
1d930 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
1d940 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
1d950 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
1d960 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
1d970 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
1d980 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
1d990 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
1d9a0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
1d9b0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
1d9c0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
1d9d0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
1d9e0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
1d9f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1da00 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
1da10 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1da20 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
1da30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1da40 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
1da50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
1da60 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
1da70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1da80 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
1da90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1daa0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1dab0 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67  SERVED );.  pPag
1dac0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
1dad0 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e  ge;.  assertTrun
1dae0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
1daf0 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Pager);.}.../*.*
1db00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1db10 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
1db20 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f   attempting a ho
1db30 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1db40 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20  ck. It.** syncs 
1db50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1db60 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73   to disk, then s
1db70 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ets pPager->jour
1db80 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a  nalHdr to the.**
1db90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1dba0 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61  rnal file so tha
1dbb0 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  t the pager_play
1dbc0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b  back() routine k
1dbd0 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  nows.** that the
1dbe0 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
1dbf0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
1dc00 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63  nced..**.** Sync
1dc10 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1dc20 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  l to disk before
1dc30 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
1dc40 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75  oll it back ensu
1dc50 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20  res .** that if 
1dc60 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  a power-failure 
1dc70 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
1dc80 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  e rollback, the 
1dc90 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20  process that.** 
1dca0 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63  attempts rollbac
1dcb0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74  k following syst
1dcc0 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73  em recovery sees
1dcd0 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61   the same journa
1dce0 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20  l.** content as 
1dcf0 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
1dd00 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
1dd10 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65  g goes as planne
1dd20 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
1dd30 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1dd40 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  ise, .** an SQLi
1dd50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
1dd60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1dd70 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
1dd80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1dd90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dda0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
1ddb0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1ddc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ddd0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1dde0 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
1ddf0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69  NORMAL);.  }.  i
1de00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1de10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1de20 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1de30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
1de40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1de50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1de60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
1de70 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
1de80 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
1de90 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
1dea0 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
1deb0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
1dec0 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
1ded0 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
1dee0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
1def0 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
1df00 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1df10 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
1df20 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
1df30 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
1df40 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
1df50 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
1df60 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
1df70 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
1df80 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
1df90 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
1dfa0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1dfb0 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
1dfc0 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
1dfd0 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
1dfe0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
1dff0 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
1e000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1e010 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
1e020 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
1e030 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
1e040 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e050 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
1e060 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
1e070 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
1e080 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
1e090 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
1e0a0 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
1e0b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1e0c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1e0d0 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
1e0e0 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70  pPager){.  u8 *p
1e0f0 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
1e100 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
1e110 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
1e120 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
1e130 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
1e140 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1e150 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1e160 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1e170 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
1e180 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
1e190 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
1e1a0 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
1e1b0 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20 28  ger->pWal,.    (
1e1c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
1e1d0 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e   0 : pPager->syn
1e1e0 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20 70  c_flags), .    p
1e1f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1e200 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50 61   pTmp.  );.  pPa
1e210 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
1e220 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
1e230 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
1e240 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1e250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
1e260 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
1e270 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e     /* Set Pager.
1e280 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31  journalHdr to -1
1e290 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74   for the benefit
1e2a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c   of the pager_pl
1e2b0 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a  ayback() .    **
1e2c0 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20   call which may 
1e2d0 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74  be made from wit
1e2e0 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  hin pagerUnlockA
1e2f0 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66  ndRollback(). If
1e300 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
1e310 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75  t -1, then the u
1e320 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
1e330 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  of an open journ
1e340 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20  al file may.    
1e350 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ** be played bac
1e360 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
1e370 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
1e380 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
1e390 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
1e3a0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
1e3b0 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1e3c0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
1e3d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
1e3e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1e3f0 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  d) ){.      pPag
1e400 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 61  er->errCode = pa
1e410 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1e420 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
1e430 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
1e440 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
1e450 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
1e460 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
1e470 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
1e480 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1e490 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
1e4a0 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
1e4b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e4c0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
1e4d0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
1e4e0 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
1e4f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
1e500 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  fd);.  sqlite3Os
1e510 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1e520 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1e530 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
1e540 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
1e550 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e560 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1e570 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
1e580 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
1e590 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
1e5a0 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
1e5b0 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
1e5c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
1e5d0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
1e5e0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
1e5f0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1e600 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
1e610 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
1e620 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
1e630 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
1e640 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
1e650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e660 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
1e670 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
1e680 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1e690 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1e6a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e6b0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
1e6c0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
1e6d0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
1e6e0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1e6f0 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
1e700 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1e710 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
1e720 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
1e730 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
1e740 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
1e750 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
1e760 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1e770 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
1e780 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
1e790 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
1e7a0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
1e7b0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
1e7c0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
1e7d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1e7e0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
1e7f0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
1e800 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
1e810 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
1e820 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
1e830 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
1e840 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1e850 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1e860 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
1e870 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  lag is not set, 
1e880 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1e890 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  on is a.** no-op
1e8a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1e8b0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
1e8c0 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
1e8d0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20  journal-mode.** 
1e8e0 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63  and the device c
1e8f0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
1e900 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73  f the the file-s
1e910 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
1e920 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
1e930 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1e940 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1e950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
1e960 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
1e970 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
1e980 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
1e990 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
1e9a0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
1e9b0 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
1e9c0 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
1e9d0 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
1e9e0 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
1e9f0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
1ea00 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
1ea10 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
1ea20 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
1ea30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
1ea40 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
1ea50 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
1ea60 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
1ea70 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
1ea80 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
1ea90 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
1eaa0 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
1eab0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1eac0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
1ead0 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
1eae0 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
1eaf0 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
1eb00 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
1eb10 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
1eb20 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
1eb30 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
1eb40 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1eb50 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
1eb60 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
1eb70 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
1eb80 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1eb90 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
1eba0 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
1ebb0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
1ebc0 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
1ebd0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1ebe0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
1ebf0 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
1ec00 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
1ec10 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
1ec20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
1ec30 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1ec40 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
1ec50 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   The Pager.needS
1ec60 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65  ync flag is neve
1ec70 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d  r be set for tem
1ec80 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72  porary files, or
1ec90 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   any.** file ope
1eca0 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  rating in no-syn
1ecb0 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f  c mode (Pager.no
1ecc0 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d  Sync set to non-
1ecd0 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  zero)..**.** If 
1ece0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
1ecf0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
1ed00 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1ed10 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
1ed20 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
1ed30 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
1ed40 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
1ed50 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
1ed60 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
1ed70 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1ed80 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1ed90 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1eda0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1edb0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1edc0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
1edd0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ede0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
1edf0 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
1ee00 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1ee10 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1ee20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ee30 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1ee40 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
1ee50 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20  {.      int rc; 
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1ee90 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
1eea0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1eeb0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1eec0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1eed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1eee0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1eef0 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
1ef00 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1ef10 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1ef20 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
1ef30 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
1ef40 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
1ef50 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
1ef60 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
1ef70 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
1ef80 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
1ef90 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
1efa0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
1efb0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
1efc0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
1efd0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1efe0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
1eff0 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
1f000 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
1f010 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
1f020 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
1f030 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
1f040 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
1f050 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1f060 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
1f070 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1f080 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
1f090 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
1f0a0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
1f0b0 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
1f0c0 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
1f0d0 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
1f0e0 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
1f0f0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
1f100 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
1f110 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
1f120 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
1f130 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
1f140 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
1f150 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1f160 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
1f170 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
1f180 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f190 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
1f1a0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
1f1b0 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
1f1c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
1f1d0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1f1e0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
1f1f0 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
1f200 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
1f210 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
1f220 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
1f230 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
1f240 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
1f250 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
1f260 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
1f270 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
1f280 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
1f290 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
1f2a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1f2b0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1f2c0 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
1f2d0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
1f2e0 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
1f2f0 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
1f300 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
1f310 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
1f320 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
1f330 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
1f340 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
1f350 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
1f360 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
1f370 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
1f380 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1f390 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
1f3a0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
1f3b0 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
1f3c0 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
1f3d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
1f3e0 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
1f3f0 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
1f400 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
1f410 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
1f420 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
1f430 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
1f440 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
1f450 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
1f460 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1f470 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
1f480 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
1f490 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
1f4a0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
1f4b0 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
1f4c0 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
1f4d0 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
1f4e0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
1f4f0 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
1f500 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
1f510 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
1f520 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1f530 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
1f540 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
1f550 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1f560 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
1f570 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
1f580 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
1f590 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
1f5a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f5b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f5c0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
1f5d0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
1f5e0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1f5f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f600 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
1f610 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
1f620 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
1f630 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1f640 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
1f650 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
1f660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f670 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1f680 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
1f690 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
1f6a0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1f6b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f6c0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1f6d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1f6e0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1f6f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f700 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f710 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1f720 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
1f730 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1f740 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
1f750 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
1f760 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
1f770 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1f780 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
1f790 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
1f7a0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
1f7b0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
1f7c0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
1f7d0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
1f7e0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
1f7f0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
1f800 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
1f810 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1f820 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
1f830 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
1f840 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
1f850 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
1f860 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
1f870 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
1f880 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
1f890 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
1f8a0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
1f8b0 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
1f8c0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
1f8d0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
1f8e0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
1f8f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
1f900 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
1f910 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
1f920 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1f930 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
1f940 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
1f950 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1f960 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
1f970 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1f980 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1f990 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1f9a0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f9b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1f9c0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1f9d0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1f9e0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1f9f0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
1fa00 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
1fa10 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1fa20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1fa30 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1fa40 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1fa50 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1fa60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1fa70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1fa80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1fa90 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1faa0 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
1fab0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
1fac0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1fad0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1fae0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1fb00 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
1fb10 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
1fb20 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
1fb30 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
1fb40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1fb50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1fb60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1fb70 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1fb80 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1fb90 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1fba0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1fbb0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1fbc0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1fbd0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1fbe0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1fbf0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1fc00 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
1fc10 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1fc20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1fc30 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
1fc40 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
1fc50 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
1fc60 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1fc70 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
1fc80 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
1fc90 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1fca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fcb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fcc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fcd0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1fce0 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63  le was just succ
1fcf0 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
1fd00 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53   Set Pager.needS
1fd10 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a  ync .    ** to z
1fd20 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ero and clear th
1fd30 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
1fd40 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61  C flag on all pa
1fd50 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gess..    */.   
1fd60 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1fd70 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1fd80 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1fd90 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  d = 1;.    pPage
1fda0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1fdb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fdc0 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ff;.    sqlite3P
1fdd0 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
1fde0 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
1fdf0 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  che);.  }..  ret
1fe00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fe10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
1fe20 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1fe30 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
1fe40 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1fe50 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
1fe60 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
1fe70 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
1fe80 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
1fe90 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
1fea0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
1feb0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
1fec0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1fed0 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
1fee0 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
1fef0 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
1ff00 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
1ff10 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
1ff20 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
1ff30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
1ff40 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
1ff50 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
1ff60 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
1ff70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1ff80 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
1ff90 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
1ffa0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1ffb0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
1ffc0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
1ffd0 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
1ffe0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
1fff0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
20000 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
20010 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
20020 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
20030 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
20040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20050 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
20060 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
20070 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
20080 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
20090 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
200a0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
200b0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
200c0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
200d0 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
200e0 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
200f0 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
20100 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
20110 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
20120 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
20130 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
20140 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
20150 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
20160 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
20170 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
20180 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
20190 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
201a0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
201b0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
201c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
201d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
201e0 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
201f0 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
20200 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
20210 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
20220 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
20230 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
20240 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
20250 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
20260 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
20270 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
20280 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
20290 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
202a0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
202b0 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
202c0 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
202d0 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
202e0 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
202f0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
20300 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
20310 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
20320 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
20330 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
20340 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
20350 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
20360 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
20370 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
20380 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
20390 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
203a0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
203b0 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
203c0 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
203d0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
203e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
203f0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
20400 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
20410 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
20420 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20440 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
20450 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20470 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20480 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
20490 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29 20  NEVER(pList==0) 
204a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
204b0 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
204c0 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
204d0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
204e0 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
204f0 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
20500 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
20510 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
20520 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
20530 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
20540 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
20550 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
20560 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20  ng.  ** call is 
20570 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20  a no-op..  **.  
20580 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
20590 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
205a0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
205b0 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
205c0 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
205d0 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
205e0 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
205f0 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
20600 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
20610 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
20620 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
20630 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
20640 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
20650 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
20660 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
20670 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
20680 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
20690 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
206a0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
206b0 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
206c0 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
206d0 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
206e0 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
206f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
20700 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
20710 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
20720 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
20730 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
20740 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
20750 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
20760 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
20770 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
20780 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
20790 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
207a0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
207b0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
207c0 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
207d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
207e0 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
207f0 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
20800 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
20810 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
20820 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
20830 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
20840 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61 67  eWal(pList->pPag
20850 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
20860 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20870 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
20880 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
20890 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
208a0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
208b0 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  CK);..  /* If th
208c0 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
208d0 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
208e0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
208f0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
20900 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
20910 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
20920 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
20930 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
20940 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
20950 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
20960 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
20970 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
20980 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
20990 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
209a0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
209b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
209c0 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
209d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
209e0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
209f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
20a00 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
20a10 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
20a20 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
20a30 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
20a40 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
20a50 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
20a60 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
20a70 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 69  ill be..  */.  i
20a80 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
20a90 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64 62 4f  e > (pPager->dbO
20aa0 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20 69 73  rigSize+1) && is
20ab0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
20ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
20ad0 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
20ae0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
20af0 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
20b00 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
20b10 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
20b20 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
20b30 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
20b40 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
20b50 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20 77  zFile);.  }..  w
20b60 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
20b70 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
20b80 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
20b90 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
20ba0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
20bb0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
20bc0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
20bd0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
20be0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
20bf0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
20c00 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
20c10 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
20c20 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
20c30 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
20c40 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
20c50 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
20c60 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
20c70 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
20c80 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
20c90 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
20ca0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
20cb0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
20cc0 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
20cd0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
20ce0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
20cf0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
20d00 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
20d10 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
20d20 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
20d30 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
20d40 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
20d50 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
20d60 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
20d70 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
20d80 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
20d90 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
20da0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
20db0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
20dc0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
20e00 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
20e10 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
20e20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
20e30 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
20e40 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
20e50 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
20e60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
20e70 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
20e80 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
20e90 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
20ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
20eb0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
20ec0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
20ed0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
20ee0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
20ef0 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
20f00 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
20f10 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
20f20 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
20f30 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
20f40 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
20f50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
20f60 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
20f70 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
20f80 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
20f90 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
20fa0 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
20fb0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
20fc0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
20fd0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
20fe0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
20ff0 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
21000 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
21010 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
21020 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21030 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
21040 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
21050 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
21060 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
21070 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
21080 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
21090 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
210a0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
210b0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
210c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
210d0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
210e0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
210f0 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
21100 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
21110 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
21120 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
21130 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
21140 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
21150 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
21160 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
21170 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
21180 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
21190 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
211a0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
211b0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
211c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
211d0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
211e0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
211f0 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
21200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
21210 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
21220 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
21230 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21240 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
21250 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21260 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
21270 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
21280 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
21290 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
212a0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
212b0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
212c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
212d0 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
212e0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
212f0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
21300 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
21310 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
21320 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
21330 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
21340 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21350 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
21360 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
21370 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
21380 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
21390 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
213a0 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
213b0 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
213c0 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
213d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
213e0 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
213f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
21400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21410 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
21420 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
21430 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
21440 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
21450 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
21460 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
21470 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
21480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
21490 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
214a0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
214b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
214c0 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
214d0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
214e0 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
214f0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
21500 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
21520 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
21530 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
21540 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
21550 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
21560 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
21570 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
21580 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
21590 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
215a0 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
215b0 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
215c0 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
215d0 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
215e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
215f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
21600 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
21610 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
21620 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
21630 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
21640 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
21650 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
21660 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
21670 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
21680 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
21690 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
216a0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
216b0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
216c0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
216d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
216e0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
216f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
21700 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
21710 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
21720 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
21730 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
21740 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
21750 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
21760 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
21770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21780 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
21790 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
217a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
217b0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
217c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
217d0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
217e0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
217f0 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
21800 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
21810 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21820 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
21830 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
21840 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21850 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
21860 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
21870 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
21880 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
21890 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
218a0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
218b0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
218c0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
218d0 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
218e0 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
218f0 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
21900 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
21910 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
21920 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
21930 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
21940 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
21950 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
21960 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
21970 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
21980 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
21990 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
219a0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
219b0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
219c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
219d0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
219e0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
219f0 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
21a00 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
21a10 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
21a20 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21a30 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
21a40 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
21a50 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
21a60 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
21a70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21a80 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
21a90 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
21aa0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
21ab0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
21ac0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
21ad0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
21ae0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
21af0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
21b00 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
21b10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21b20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21b30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21b40 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
21b50 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
21b60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
21b70 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
21b80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
21b90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21ba0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21bb0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
21bc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21bd0 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
21be0 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
21bf0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
21c00 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
21c10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21c20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21c30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
21c40 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
21c50 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
21c60 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
21c70 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
21c80 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
21c90 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
21ca0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
21cb0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
21cc0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
21cd0 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
21ce0 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
21cf0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
21d00 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
21d10 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
21d20 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
21d30 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
21d40 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
21d50 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
21d60 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
21d70 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
21d80 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
21d90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21da0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
21db0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
21dc0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
21dd0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
21de0 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
21df0 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
21e00 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
21e10 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
21e20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
21e30 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
21e40 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
21e50 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
21e60 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
21e70 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
21e80 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
21e90 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
21ea0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
21eb0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
21ec0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
21ed0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
21ee0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21ef0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
21f00 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
21f10 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
21f20 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
21f30 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
21f40 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
21f50 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
21f60 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
21f70 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
21f80 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
21f90 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
21fa0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
21fb0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
21fc0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
21fd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
21fe0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
21ff0 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
22000 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
22010 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
22020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22030 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
22040 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
22050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
22060 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
22070 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
22080 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
22090 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
220a0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
220b0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
220c0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
220d0 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
220e0 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
220f0 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
22100 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
22110 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
22120 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
22130 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
22140 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
22150 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
22160 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
22170 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
22180 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
22190 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
221a0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
221b0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
221c0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
221d0 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
221e0 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
221f0 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
22200 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
22210 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
22220 20 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e 20   inhibited when 
22230 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
22240 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
22250 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
22260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22270 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22280 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74  doNotSpill ) ret
22290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
222a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
222b0 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28  otSyncSpill && (
222c0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
222d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
222e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
222f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
22300 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
22310 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
22320 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
22330 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
22340 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
22350 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
22360 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  log. */.    if( 
22370 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
22380 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20  (pPg) ){ .      
22390 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
223a0 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d  age(pPg); .    }
223b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
223c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
223d0 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
223e0 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
223f0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
22400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
22410 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
22420 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
22430 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
22440 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
22450 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
22460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
22470 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
22480 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
22490 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
224a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
224b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 0a 20 20 20  QLITE_OK && .   
224c0 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
224d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
224e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
224f0 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20  MORY) &&.       
22500 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
22510 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
22520 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
22530 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
22540 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b  APPEND).      ){
22550 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
22560 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
22570 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
22580 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
22590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
225a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
225b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
225c0 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
225d0 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
225e0 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  ent size of.    
225f0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
22600 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
22610 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
22620 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
22630 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  nal..    ** This
22640 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
22650 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
22660 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
22670 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
22680 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
22690 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
226a0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
226b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
226c0 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   Consider the fo
226d0 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65  llowing sequence
226e0 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20   of events:.    
226f0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49  **.    **   BEGI
22700 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a  N;.    **     <j
22710 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
22720 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66     **     <modif
22730 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  y page X>.    **
22740 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
22750 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  p;.    **       
22760 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
22770 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
22780 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70  >.    **       p
22790 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20  agerStress(page 
227a0 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f  X).    **     RO
227b0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20  LLBACK TO sp;.  
227c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28    **.    ** If (
227d0 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20  X>Y), then when 
227e0 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63  pagerStress is c
227f0 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c  alled page X wil
22800 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
22810 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  .    ** out to t
22820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22830 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
22840 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
22850 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20  ache. Then,.    
22860 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
22870 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
22880 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
22890 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
228a0 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74   read.    ** dat
228b0 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
228c0 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
228d0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
228e0 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
228f0 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20      ** was when 
22900 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22910 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
22920 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
22930 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a  EPOINT sp".    *
22940 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a  * was executed..
22950 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
22960 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
22970 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
22980 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
22990 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20   X into the .   
229a0 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
229b0 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20  file now (if it 
229c0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74  is not already t
229d0 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69  here), so that i
229e0 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
229f0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
22a00 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
22a10 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
22a20 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20  K TO sp" is .   
22a30 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
22a40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56    */.    if( NEV
22a50 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  ER(.        rc==
22a60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
22a70 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
22a80 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
22a90 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
22aa0 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63     ) ){.      rc
22ab0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
22ac0 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
22ad0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
22ae0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22af0 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
22b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22b10 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
22b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
22b40 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
22b50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
22b60 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
22b70 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
22b80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22b90 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
22ba0 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
22bb0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
22bc0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
22bd0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
22be0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
22bf0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
22c00 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
22c10 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
22c20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
22c30 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
22c40 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
22c50 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
22c60 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
22c70 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
22c80 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
22c90 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
22ca0 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
22cb0 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
22cc0 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
22cd0 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
22ce0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
22cf0 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
22d00 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
22d10 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
22d20 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
22d30 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
22d40 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
22d50 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
22d60 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
22d70 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
22d80 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
22d90 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
22da0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
22db0 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
22dc0 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
22dd0 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
22de0 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
22df0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
22e00 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
22e10 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
22e20 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
22e30 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
22e40 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
22e50 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
22e60 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
22e70 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
22e80 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
22e90 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
22ea0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
22eb0 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
22ec0 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
22ed0 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
22ee0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
22ef0 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
22f00 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
22f10 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a  tExtra() API..**
22f20 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
22f30 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
22f40 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
22f50 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
22f60 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
22f70 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
22f80 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
22f90 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
22fa0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
22fb0 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49  of the PAGER_OMI
22fc0 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41  T_JOURNAL and PA
22fd0 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20  GER_NO_READLOCK 
22fe0 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
22ff0 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
23000 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
23010 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
23020 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
23030 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
23040 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
23050 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
23060 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
23070 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
23080 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
23090 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
230a0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
230b0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
230c0 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
230d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
230e0 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
230f0 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
23100 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
23110 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
23120 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
23130 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
23140 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
23150 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
23160 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
23170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23180 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
23190 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
231a0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
231b0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
231c0 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
231d0 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
231e0 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
231f0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
23200 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
23210 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
23220 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
23230 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
23240 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
23250 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
23260 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
23270 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
23280 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
23290 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
232a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
232b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
232c0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
232d0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
232e0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
232f0 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
23300 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
23310 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
23320 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
23330 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
23340 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
23350 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
23360 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
23370 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
23380 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
23390 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
233a0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
233b0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
233c0 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
233d0 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
233e0 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
233f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
23400 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
23410 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
23420 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
23430 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
23440 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
23450 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23460 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
23470 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
23480 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
23490 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
234a0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
234b0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
234c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
234d0 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
234e0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
234f0 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
23500 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
23510 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
23520 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
23530 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
23540 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
23550 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
23560 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
23570 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
23580 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
23590 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
235a0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
235b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
235c0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
235d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
235e0 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
235f0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
23600 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
23610 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
23620 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
23630 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
23640 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64   */.  int noRead
23650 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
23660 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
23670 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  K)!=0;  /* True 
23680 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63  to omit read-loc
23690 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  k */.  int pcach
236a0 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
236b0 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
236c0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
236d0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
236e0 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61  he */.  u16 szPa
236f0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
23700 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
23710 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
23720 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f  age size */..  /
23730 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
23740 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
23750 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
23760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
23770 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
23780 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
23790 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
237a0 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
237b0 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20  ournal). This.  
237c0 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ** is the maximu
237d0 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
237e0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
237f0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  y journal file h
23800 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20  andle .  ** and 
23810 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  a regular journa
23820 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e  l file-handle. N
23830 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75  ote that a "regu
23840 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64  lar journal-hand
23850 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  le".  ** may be 
23860 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c  a wrapper capabl
23870 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65  e of caching the
23880 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f   first portion o
23890 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
238a0 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72  ** file in memor
238b0 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
238c0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
238d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65  optimization (se
238e0 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  e .  ** source f
238f0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a  ile journal.c)..
23900 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
23910 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
23920 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
23930 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
23940 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
23950 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
23960 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
23970 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Vfs));.  }else{.
23980 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
23990 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
239a0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
239b0 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ze());.  }..  /*
239c0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
239d0 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
239e0 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
239f0 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
23a00 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
23a10 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
23a20 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
23a30 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
23a40 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
23a50 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
23a60 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
23a70 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
23a80 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
23a90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
23aa0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
23ab0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
23ac0 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
23ad0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
23ae0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
23af0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
23b00 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
23b10 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
23b20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
23b30 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68  ite3Malloc(nPath
23b40 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
23b50 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
23b60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23b70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23b80 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23b90 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
23ba0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
23bb0 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
23bc0 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
23bd0 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
23be0 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
23bf0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  0;.    }else.#en
23c00 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
23c10 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
23c20 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
23c30 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
23c40 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
23c50 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20  ) fails */.     
23c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
23c70 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
23c80 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
23c90 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
23ca0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  e);.    }..    n
23cb0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
23cc0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
23cd0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
23ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23cf0 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
23d00 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
23d10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
23d20 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
23d30 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
23d40 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
23d50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
23d60 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
23d70 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
23d80 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
23d90 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
23da0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
23db0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
23dc0 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
23dd0 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
23de0 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
23df0 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
23e00 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
23e10 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
23e20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
23e30 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
23e40 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
23e50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
23e60 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
23e70 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
23e80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23e90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
23ea0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
23eb0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
23ec0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
23ed0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
23ee0 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
23ef0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
23f00 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
23f10 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
23f20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
23f30 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
23f40 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
23f50 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
23f60 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
23f70 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
23f80 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
23f90 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
23fa0 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
23fc0 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
23fd0 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
23fe0 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
23ff0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
24000 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
24010 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
24020 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
24030 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
24040 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
24050 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
24060 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
24070 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
24080 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
24090 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
240a0 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
240b0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
240c0 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
240d0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
240e0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
240f0 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
24100 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
24110 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
24120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24140 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
24150 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
24160 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
24170 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
24180 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
24190 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
241a0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
241b0 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
241c0 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
241d0 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
241e0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
241f0 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
24200 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
24210 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
24220 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
24230 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
24240 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24250 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
24260 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
24270 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
24280 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
24290 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
242a0 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20  thname + 8 + 1  
242b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
242c0 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
242d0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
242e0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
242f0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
24300 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
24310 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
24320 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
24330 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
24340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24350 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
24360 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
24370 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
24380 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
24390 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
243a0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
243b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
243c0 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
243d0 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
243e0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
243f0 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
24400 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
24410 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
24420 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
24430 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
24440 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
24450 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
24460 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
24470 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
24480 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
24490 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
244a0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
244b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
244c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
244d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
244e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
244f0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
24500 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
24510 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
24520 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
24530 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
24540 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
24550 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
24560 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
24570 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
24580 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
24590 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
245a0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
245b0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
245c0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
245d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
245e0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
245f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
24600 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
24610 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
24620 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69  rnal", 8);.    i
24630 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  f( pPager->zFile
24640 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61  name[0]==0 ) pPa
24650 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d  ger->zJournal[0]
24660 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
24670 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
24680 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
24690 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
246a0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
246b0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
246c0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
246d0 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
246e0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
246f0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20  zFilename[0] && 
24700 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e  !memDb ){.    in
24710 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24730 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
24740 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
24750 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
24760 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
24770 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
24780 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
24790 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
247a0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
247b0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
247c0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
247d0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
247e0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
247f0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
24800 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
24810 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
24820 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
24830 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
24840 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
24850 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
24860 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
24870 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
24880 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
24890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
248a0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
248b0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
248c0 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
248d0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
248e0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
248f0 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
24900 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
24910 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
24920 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
24930 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
24940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24950 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
24960 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  ){.      setSect
24970 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
24980 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
24990 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
249a0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
249b0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
249c0 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
249d0 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
249e0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
249f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
24a00 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
24a10 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
24a20 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
24a30 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
24a40 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
24a50 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
24a60 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  IZE;.        }el
24a70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
24a80 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29  PageDflt = (u16)
24a90 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
24aa0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
24ab0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
24ac0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
24ad0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a  C_WRITE.      {.
24ae0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
24af0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
24b00 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
24b10 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
24b20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
24b30 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
24b40 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
24b50 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
24b60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
24b70 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
24b80 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
24b90 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
24ba0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
24bb0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
24bc0 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
24bd0 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
24be0 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
24bf0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
24c00 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
24c10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
24c20 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
24c30 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
24c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
24c50 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
24c60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
24c80 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ndif.    }.  }el
24c90 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
24ca0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
24cb0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
24cc0 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
24cd0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
24ce0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
24cf0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
24d00 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
24d10 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
24d20 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
24d30 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
24d40 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
24d50 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
24d60 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
24d70 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
24d80 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
24d90 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
24da0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
24db0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
24dc0 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
24dd0 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
24de0 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
24df0 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
24e00 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
24e10 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
24e20 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20  urnal..    */ . 
24e30 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
24e40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
24e50 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
24e60 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e  SIVE;.    readOn
24e70 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
24e80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
24e90 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
24ea0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
24eb0 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
24ec0 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
24ed0 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
24ee0 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
24ef0 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
24f00 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
24f10 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
24f20 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
24f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24f50 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
24f60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24f70 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
24f80 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
24f90 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
24fa0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
24fb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
24fc0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
24fd0 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74   occurred in eit
24fe0 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
24ff0 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
25000 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
25010 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
25020 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
25030 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
25050 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
25060 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
25070 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
25080 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
25090 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
250a0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
250b0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
250c0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
250d0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
250e0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
250f0 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20  000 );.  nExtra 
25100 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
25110 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
25120 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
25130 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
25140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25150 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
25160 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
25170 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
25180 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
25190 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
251a0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
251b0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
251c0 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
251d0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
251e0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
251f0 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
25200 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
25210 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
25220 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
25230 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
25240 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
25250 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
25260 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
25270 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
25280 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
25290 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
252a0 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
252b0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
252c0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
252d0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
252e0 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
252f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
25300 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
25310 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
25320 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
25330 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
25340 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
25350 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
25360 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
25370 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
25380 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
25390 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
253a0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
253b0 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
253c0 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
253d0 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
253e0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
253f0 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
25400 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
25410 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
25420 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
25430 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
25440 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
25450 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
25460 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
25470 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
25480 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
25490 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
254a0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
254b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
254c0 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
254d0 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
254e0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
254f0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
25500 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
25510 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
25520 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
25530 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
25540 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
25550 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
25560 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  /.  assert( useJ
25570 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
25580 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
25590 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
255a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
255b0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
255c0 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  lSync = pPager->
255d0 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70  noSync ?0:1;.  p
255e0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
255f0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
25600 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
25610 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
25620 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
25630 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
25640 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
25650 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
25660 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
25670 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
25680 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
25690 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
256a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
256b0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
256c0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
256d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
256e0 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
256f0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
25700 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
25710 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
25720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
25730 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
25740 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
25750 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
25760 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
25770 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
25780 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
25790 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
257a0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
257b0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
257c0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
257d0 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
257e0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
257f0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
25800 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
25810 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
25820 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
25830 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
25840 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
25850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25860 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
25870 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25880 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
25890 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
258a0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
258b0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
258c0 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
258d0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
258e0 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
258f0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
25900 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
25910 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
25920 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
25930 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
25940 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
25950 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
25960 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
25970 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
25980 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
25990 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
259a0 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
259b0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
259c0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
259d0 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
259e0 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
259f0 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
25a00 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
25a10 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
25a20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
25a30 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
25a40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
25a50 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
25a60 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
25a70 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
25a80 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
25a90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
25aa0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
25ab0 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
25ac0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
25ad0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
25ae0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
25af0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
25b00 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
25b10 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
25b20 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
25b30 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
25b40 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
25b50 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
25b60 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
25b70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
25b80 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
25b90 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
25ba0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
25bb0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
25bc0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
25bd0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
25be0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
25bf0 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
25c00 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
25c10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
25c20 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
25c30 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
25c40 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
25c50 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
25c60 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
25c70 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
25c80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
25c90 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
25ca0 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
25cb0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
25cc0 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
25cd0 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
25ce0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
25cf0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
25d00 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
25d10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25d20 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
25d30 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
25d40 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
25d50 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
25d60 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
25d70 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
25d80 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
25d90 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
25da0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25db0 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
25dc0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
25dd0 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
25de0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
25df0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25e00 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
25e10 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
25e20 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
25e30 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
25e40 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
25e50 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
25e60 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
25e70 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
25e80 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
25e90 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
25ea0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
25eb0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
25ec0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25ed0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
25ee0 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
25ef0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
25f00 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
25f10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25f20 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
25f30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25f40 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
25f50 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
25f60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
25f70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25f80 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
25f90 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
25fa0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25fb0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
25fc0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
25fd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
25fe0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
25ff0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
26000 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
26010 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
26020 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52  te <= PAGER_SHAR
26030 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
26040 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28  jrnlOpen==0 || (
26050 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
26060 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
26070 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20  pPager->jfd) &. 
26080 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
26090 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
260a0 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a  _OPEN.  ));..  *
260b0 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69  pExists = 0;.  i
260c0 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
260d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
260e0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
260f0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26100 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
26110 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
26120 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
26130 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
26140 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f  ts ){.    int lo
26150 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  cked;           
26160 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
26170 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f   some process ho
26180 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
26190 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ock */..    /* R
261a0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65  ace condition he
261b0 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f  re:  Another pro
261c0 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20  cess might have 
261d0 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65  been holding the
261e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45  .    ** the RESE
261f0 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61  RVED lock and ha
26200 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65  ve a journal ope
26210 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  n at the sqlite3
26220 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20  OsAccess() .    
26230 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62  ** call above, b
26240 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ut then delete t
26250 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64  he journal and d
26260 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66  rop the lock bef
26270 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65  ore.    ** we ge
26280 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
26290 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  ng sqlite3OsChec
262a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20  kReservedLock() 
262b0 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20  call.  If that. 
262c0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73     ** is the cas
262d0 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
262e0 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72  might think ther
262f0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
26300 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69  al when.    ** i
26310 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20  n fact there is 
26320 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75  none.  This resu
26330 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70  lts in a false-p
26340 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69  ositive which wi
26350 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  ll.    ** be dea
26360 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70  lt with by the p
26370 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  layback routine.
26380 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a    Ticket #3883..
26390 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
263a0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
263b0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
263c0 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
263d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
263e0 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65  ITE_OK && !locke
263f0 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
26400 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Page;..      /* 
26410 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
26420 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
26430 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
26440 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
26450 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
26460 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
26470 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
26480 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
26490 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
264a0 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
264b0 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
264c0 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
264d0 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
264e0 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
264f0 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
26500 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
26510 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
26520 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
26530 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
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 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26560 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
26570 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
26580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26590 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
265a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
265b0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
265c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
265d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
265e0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
265f0 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
26600 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
26610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
26620 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
26630 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
26640 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
26650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
26660 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
26670 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
26680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
266a0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
266b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
266c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
266d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
266e0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
266f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
26700 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
26710 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
26720 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
26730 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
26740 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
26750 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
26760 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
26770 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
26780 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
26790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
267a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
267b0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
267c0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
267d0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
267e0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
267f0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
26800 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
26810 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26820 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
26830 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
26840 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
26850 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
26860 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
26870 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
26880 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26890 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
268a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
268b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
268c0 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
268d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
268e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
268f0 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
26900 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
26910 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26920 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
26930 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
26940 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
26950 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
26960 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
26970 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
26980 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26990 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
269a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
269b0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
269c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
269d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
269e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
269f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26a00 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
26a10 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
26a20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
26a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26a40 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
26a50 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
26a60 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
26a70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
26a80 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
26a90 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
26aa0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73        ** its has
26ab0 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
26ac0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
26ad0 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
26ae0 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
26af0 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
26b00 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
26b10 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
26b20 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
26b30 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
26b40 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
26b50 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
26b60 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
26b70 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
26b80 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
26b90 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
26ba0 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
26bb0 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
26bc0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
26bd0 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
26be0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
26bf0 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
26c00 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
26c10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
26c20 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
26c30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
26c40 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
26c50 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
26c60 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
26c70 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
26c80 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
26c90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
26ca0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
26cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
26cc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26ce0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
26cf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
26d00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
26d10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26d20 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
26d30 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
26d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26d50 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
26d60 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
26d70 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
26d80 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
26d90 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
26da0 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
26db0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
26dc0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
26dd0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
26de0 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
26df0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
26e00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
26e10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
26e20 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
26e30 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
26e40 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
26e50 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
26e60 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
26e70 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55  ently in PAGER_U
26e80 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20  NLOCK state (no 
26e90 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20  lock held.**    
26ea0 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
26eb0 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e  e file), then an
26ec0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
26ed0 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20   to obtain a.** 
26ee0 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b       SHARED lock
26ef0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26f00 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65   file. Immediate
26f10 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
26f20 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53  ng.**      the S
26f30 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
26f40 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63  file-system is c
26f50 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74  hecked for a hot
26f60 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20  -journal,.**    
26f70 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65    which is playe
26f80 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e  d back if presen
26f90 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79  t. Following any
26fa0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   hot-journal .**
26fb0 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20        rollback, 
26fc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
26fd0 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61  the cache are va
26fe0 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b  lidated by check
26ff0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
27000 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27  'change-counter'
27010 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61   field of the da
27020 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
27030 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64  er and.**      d
27040 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79  iscarded if they
27050 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65   are found to be
27060 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20   invalid..**.** 
27070 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65    2) If the page
27080 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
27090 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20  exclusive-mode, 
270a0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75  and there are cu
270b0 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
270c0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
270d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79  eferences to any
270e0 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69   pages, and is i
270f0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
27100 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20  e,.**      then 
27110 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
27120 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  de to clear the 
27130 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64  error state by d
27140 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20  iscarding.**    
27150 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
27160 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
27170 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63   and rolling bac
27180 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e  k any open journ
27190 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e  al.**      file.
271a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
271b0 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  eration describe
271c0 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20 69  d by (2) above i
271d0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
271e0 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70   and if the.** p
271f0 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
27200 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
27210 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
27220 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
27230 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  lled,.** the err
27240 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
27250 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
27260 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65 64   It is permitted
27270 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20   to read the.** 
27280 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e  database when in
27290 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72   SQLITE_FULL err
272a0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
272b0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76  Otherwise, if ev
272c0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
272d0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
272e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
272f0 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72  f an.** IO error
27300 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
27310 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
27320 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
27330 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
27340 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e  * file or rollin
27350 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
27360 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
27370 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
27380 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
27390 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
273a0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
273b0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
273c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
273d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
273e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
273f0 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
27400 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
27410 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f 76  /* True if recov
27420 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72  ering from error
27430 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20   state */..  /* 
27440 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27450 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
27460 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
27470 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
27480 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
27490 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 61  ing pages */.  a
274a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
274b0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
274c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
274d0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
274e0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
274f0 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
27500 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
27510 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ode; }..  /* If 
27520 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
27530 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61   in an error-sta
27540 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68 61  te, now is a cha
27550 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a  nce to clear.  *
27560 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73  * the error. Dis
27570 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
27580 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
27590 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63  ache and rollbac
275a0 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20 6a  k.  ** any hot j
275b0 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69  ournal in the fi
275c0 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  le-system..  */.
275d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
275e0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
275f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27600 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
27610 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  zJournal ){.    
27620 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d    isErrorReset =
27630 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
27640 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
27650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
27660 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
27670 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
27680 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
27690 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  r) ){.    rc = p
276a0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
276b0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
276c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
276d0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
276e0 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45  ER_UNLOCK || isE
276f0 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20  rrorReset ){.   
27700 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
27710 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
27720 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  er->pVfs;.    in
27730 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  t isHotJournal =
27740 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
27750 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
27760 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
27770 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
27780 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
27790 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
277a0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
277b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
277c0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
277d0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
277e0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
277f0 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  HARED;.    }else
27800 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
27810 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
27820 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
27830 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
27840 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27860 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
27870 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
27880 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
27890 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
278a0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
278b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
278c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
278d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
278e0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
278f0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
27900 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
27910 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
27920 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
27930 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
27940 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
27950 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
27960 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
27970 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
27980 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
27990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
279a0 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50  ager->state <= P
279b0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
279c0 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
279d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
279e0 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a  &isHotJournal);.
279f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27a00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27a10 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
27a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27a30 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73    if( isErrorRes
27a40 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e  et || isHotJourn
27a50 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  al ){.      /* G
27a60 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
27a70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
27a80 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
27a90 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
27aa0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
27ab0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
27ac0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
27ad0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
27ae0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
27af0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
27b00 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
27b10 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
27b20 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
27b30 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
27b40 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
27b50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
27b60 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
27b70 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
27b80 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
27b90 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
27ba0 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
27bb0 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
27bc0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
27bd0 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
27be0 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
27bf0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
27c00 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
27c10 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
27c20 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
27c30 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
27c40 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
27c50 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
27c60 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
27c70 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
27c80 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
27c90 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
27ca0 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
27cb0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
27cc0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
27cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
27ce0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27cf0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
27d00 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  <EXCLUSIVE_LOCK 
27d10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27d20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
27d30 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
27d40 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
27d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27d70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
27d80 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
27d90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
27da0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
27db0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
27dc0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
27dd0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
27de0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65  }. .      /* Ope
27df0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
27e00 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
27e10 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ess. This is bec
27e20 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a  ause in .      *
27e30 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
27e40 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
27e50 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
27e60 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
27e70 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69  d.      ** possi
27e80 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
27e90 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
27ea0 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73   on. On some sys
27eb0 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20  tems, the.      
27ec0 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
27ed0 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
27ee0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
27ef0 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
27f00 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64  .      ** a read
27f10 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64  /write file hand
27f20 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
27f30 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
27f40 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
27f50 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
27f60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27f70 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
27f80 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s,pPager->zJourn
27f90 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53  al,SQLITE_ACCESS
27fa0 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20  _EXISTS,&res);. 
27fb0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
27fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27fd0 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
27fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
27ff0 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
28000 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
28010 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
28020 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
28030 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
28040 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
28050 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
28060 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
28070 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28080 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
28090 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
280a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
280b0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
280c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
280d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
280e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
280f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28110 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
28120 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
28130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
28140 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
28150 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
28160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
28170 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
28180 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
28190 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
281a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
281b0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
281c0 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
281d0 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
281e0 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
281f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68            ** oth
28200 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
28210 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
28220 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
28230 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 20   before .       
28240 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
28250 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
28260 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
28270 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
28280 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t .            *
28290 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
282a0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
282b0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
282c0 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
282d0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
282e0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
282f0 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
28300 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
28310 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t.  */.         
28320 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
28330 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
28340 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
28350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28380 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
28390 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
283a0 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20  .      /* Reset 
283b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74 61 74  the journal stat
283c0 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69 6e 64  us fields to ind
283d0 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 68  icates that we h
283e0 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20  ave no.      ** 
283f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
28400 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 2a   at this time. *
28410 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
28420 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
28430 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
28440 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
28450 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
28460 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
28470 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28480 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
28490 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
284a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
284b0 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
284c0 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  ed to disk. */. 
284d0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
284e0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
284f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
28500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
28510 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
28520 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
28530 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
28540 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
28550 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
28560 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
28570 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
28580 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
28590 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
285a0 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
285b0 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
285c0 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
285d0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
285e0 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
285f0 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
28600 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
28610 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
28620 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
28630 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
28640 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
28650 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
28660 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
28670 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
28680 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
28690 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
286a0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
286b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
286c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
286d0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
286e0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
286f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28710 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
28720 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
28730 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
28740 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
28770 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
28780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
28790 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
287a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
287b0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
287c0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
287d0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
287e0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
287f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
28800 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41  pPager->state>PA
28810 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
28820 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
28830 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
28840 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63  kup || sqlite3Pc
28850 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
28860 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
28870 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
28880 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
28890 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
288a0 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
288b0 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
288c0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
288d0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
288e0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
288f0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
28900 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
28910 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
28920 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
28930 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
28940 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
28950 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
28960 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
28970 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
28980 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
28990 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
289a0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
289b0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
289c0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
289d0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
289e0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
289f0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
28a00 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
28a10 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
28a20 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
28a30 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
28a40 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
28a50 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
28a60 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
28a70 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
28a80 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
28a90 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
28aa0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
28ab0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
28ac0 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
28ad0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
28ae0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
28af0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
28b00 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
28b10 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
28b20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
28b30 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
28b40 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
28b50 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
28b60 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
28b70 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
28b80 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
28b90 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30     int nPage = 0
28ba0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
28bb0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
28bc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
28bd0 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
28be0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
28bf0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
28c00 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
28c10 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
28c20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
28c30 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
28c40 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28c50 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
28c60 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
28c70 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28c80 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
28c90 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
28ca0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
28cb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28cc0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
28cd0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
28ce0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
28cf0 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
28d00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28d20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28d30 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
28d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28d50 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
28d60 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
28d70 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
28d80 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
28d90 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
28da0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
28db0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
28dc0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
28dd0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
28de0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
28df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28e00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28e10 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
28e20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
28e30 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
28e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
28e50 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
28e60 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
28e70 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
28e80 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
28e90 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
28ea0 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
28eb0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
28ec0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
28ed0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
28ee0 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
28ef0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
28f00 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
28f10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28f20 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
28f30 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
28f40 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
28f50 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
28f60 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
28f70 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
28f80 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28f90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28fa0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
28fb0 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
28fc0 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
28fd0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
28fe0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
28ff0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
29000 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
29010 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
29020 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
29030 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
29040 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
29050 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
29060 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
29070 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
29080 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
29090 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
290a0 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
290b0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
290c0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
290d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
290e0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
290f0 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
29100 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
29110 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
29120 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70  e)==0).   && (!p
29130 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
29140 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
29150 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
29160 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
29170 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
29180 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
29190 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
291a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
291b0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
291c0 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
291d0 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
291e0 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
291f0 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
29200 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
29210 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
29220 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
29230 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
29240 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
29250 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
29260 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
29270 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
29280 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
29290 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
292a0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
292b0 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
292c0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
292d0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
292e0 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
292f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
29300 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
29310 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
29320 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
29330 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
29340 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
29350 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
29360 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
29370 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
29380 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
29390 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
293a0 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
293b0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
293c0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
293d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
293e0 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
293f0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
29400 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
29410 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
29420 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
29430 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
29440 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
29450 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
29460 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
29470 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
29480 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
29490 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
294a0 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
294b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
294c0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
294d0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
294e0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
294f0 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
29500 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
29510 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
29520 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
29530 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
29540 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
29550 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
29560 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
29570 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
29580 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
29590 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
295a0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
295b0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
295c0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
295d0 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
295e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
295f0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
29600 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
29610 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
29620 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
29630 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
29640 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
29650 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
29660 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
29670 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
29680 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
29690 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
296a0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
296b0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
296c0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
296d0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
296e0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
296f0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
29700 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
29710 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
29720 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
29730 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
29740 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
29750 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
29760 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
29770 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
29780 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
29790 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
297a0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
297b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
297c0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
297d0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
297e0 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
297f0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
29800 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
29810 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
29820 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
29830 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
29840 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
29850 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
29860 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
29870 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
29880 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
29890 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
298a0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
298b0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
298c0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
298d0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
298e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
298f0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
29900 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
29910 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
29920 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
29930 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
29940 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
29950 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
29960 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
29970 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
29980 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
29990 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
299a0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
299b0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
299c0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
299d0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
299e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
299f0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
29a00 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
29a10 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
29a20 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
29a30 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
29a40 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
29a50 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
29a60 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
29a70 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
29a80 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
29a90 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
29aa0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
29ab0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
29ac0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
29ad0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
29ae0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
29af0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
29b00 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
29b10 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
29b20 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
29b30 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
29b40 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
29b50 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
29b60 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
29b70 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
29b80 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
29b90 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
29ba0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
29bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
29bc0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
29bd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
29be0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
29bf0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
29c00 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
29c10 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
29c20 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
29c30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
29c40 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
29c50 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
29c60 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
29c70 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
29c80 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
29c90 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
29ca0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
29cb0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
29cc0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
29cd0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
29ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29cf0 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f  state>PAGER_UNLO
29d00 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  CK );..  if( pgn
29d10 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
29d20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29d30 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
29d40 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
29d50 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
29d60 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
29d70 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
29d80 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
29d90 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
29da0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
29db0 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
29dc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
29dd0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
29de0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
29df0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
29e00 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
29e10 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
29e20 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
29e30 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
29e40 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
29e50 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
29e60 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
29e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29e80 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
29e90 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
29ea0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
29eb0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
29ec0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
29ed0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
29ee0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
29ef0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
29f00 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
29f10 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
29f20 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
29f30 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
29f40 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
29f50 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
29f60 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
29f70 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
29f80 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
29f90 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
29fa0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
29fb0 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
29fc0 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
29fd0 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
29fe0 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
29ff0 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
2a000 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
2a010 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2a020 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
2a030 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
2a040 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
2a050 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
2a060 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
2a070 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
2a080 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2a090 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
2a0a0 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
2a0b0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
2a0c0 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
2a0d0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
2a0e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a0f0 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
2a100 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
2a110 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
2a120 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
2a130 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
2a140 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
2a150 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
2a160 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a  .    int nMax;..
2a170 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
2a180 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
2a190 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
2a1a0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
2a1b0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
2a1c0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
2a1d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
2a1e0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
2a1f0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
2a200 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
2a210 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
2a220 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
2a230 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
2a240 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
2a250 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
2a260 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
2a270 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
2a280 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
2a290 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2a2a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2a2b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
2a2c0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
2a2d0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
2a2e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
2a2f0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
2a300 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
2a310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a320 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
2a330 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
2a340 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
2a350 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67   || nMax<(int)pg
2a360 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
2a370 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
2a380 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
2a390 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
2a3a0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
2a3b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
2a3c0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
2a3d0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
2a3e0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
2a3f0 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
2a400 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
2a410 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
2a420 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
2a430 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
2a440 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
2a450 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
2a460 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
2a470 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
2a480 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
2a490 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
2a4a0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
2a4b0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a4c0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
2a4d0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
2a4e0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
2a4f0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
2a500 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
2a510 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2a520 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
2a530 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
2a540 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
2a550 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
2a560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
2a570 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
2a580 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a590 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
2a5a0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
2a5b0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
2a5c0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
2a5d0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
2a5e0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
2a5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2a600 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
2a610 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2a620 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
2a630 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
2a640 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2a650 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
2a660 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2a670 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
2a680 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2a690 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2a6a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2a6b0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
2a6c0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
2a6d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2a6e0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2a6f0 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
2a700 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2a710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a720 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2a730 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2a740 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
2a750 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
2a760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2a780 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
2a790 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
2a7a0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2a7b0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2a7c0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2a7d0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2a7e0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2a7f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a800 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
2a810 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
2a820 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2a830 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
2a840 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
2a850 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
2a860 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
2a870 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
2a880 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
2a890 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
2a8a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
2a8b0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
2a8c0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2a8d0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
2a8e0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
2a8f0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
2a900 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
2a910 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
2a920 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
2a930 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2a940 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
2a950 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
2a960 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
2a970 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
2a980 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
2a990 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
2a9a0 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
2a9b0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
2a9c0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
2a9d0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
2a9e0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2a9f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2aa00 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
2aa10 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2aa20 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
2aa30 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2aa40 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
2aa50 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
2aa60 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
2aa70 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
2aa80 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2aa90 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
2aaa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
2aab0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
2aac0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2aad0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
2aae0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
2aaf0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
2ab00 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
2ab10 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
2ab20 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
2ab30 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
2ab40 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
2ab50 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
2ab60 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
2ab70 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
2ab80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ab90 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
2aba0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2abb0 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
2abc0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
2abd0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
2abe0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
2abf0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
2ac00 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
2ac10 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
2ac20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
2ac30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
2ac40 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2ac50 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
2ac60 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
2ac70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
2ac80 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
2ac90 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
2aca0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2acb0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
2acc0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
2acd0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
2ace0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
2acf0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
2ad00 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
2ad10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2ad20 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
2ad30 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
2ad40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2ad50 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2ad60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
2ad70 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
2ad80 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
2ad90 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
2ada0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2adb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2adc0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
2add0 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
2ade0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
2adf0 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
2ae00 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
2ae10 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
2ae20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2ae30 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
2ae40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2ae50 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
2ae60 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2ae70 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
2ae80 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
2ae90 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
2aea0 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
2aeb0 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
2aec0 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
2aed0 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
2aee0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
2aef0 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
2af00 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
2af10 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
2af20 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
2af30 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
2af40 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
2af50 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
2af60 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
2af70 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
2af80 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
2af90 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
2afa0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
2afb0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2afc0 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
2afd0 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
2afe0 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
2aff0 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
2b000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
2b010 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
2b020 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2b030 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
2b040 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
2b050 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
2b060 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
2b070 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2b080 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
2b090 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
2b0a0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2b0b0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
2b0c0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
2b0d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2b0e0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2b0f0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2b100 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
2b110 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
2b120 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
2b130 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
2b140 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2b150 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2b160 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2b170 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
2b180 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
2b190 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
2b1a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2b1b0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
2b1c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2b1d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b1e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b200 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2b210 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2b240 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2b250 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
2b260 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2b270 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2b280 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
2b290 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
2b2a0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
2b2b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2b2c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2b2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b2e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2b2f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2b310 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b320 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
2b330 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
2b340 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
2b350 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
2b360 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2b370 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
2b380 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
2b390 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
2b3a0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
2b3b0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
2b3c0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
2b3d0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
2b3e0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
2b3f0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2b400 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2b410 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
2b420 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74  r->errCode;..  t
2b430 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b440 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
2b450 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2b460 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2b470 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2b480 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2b490 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
2b4a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
2b4b0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2b4c0 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(nPage);.  if( 
2b4d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b4e0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  al==0 ){.    ret
2b4f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b500 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2b510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b520 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
2b530 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
2b540 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2b550 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2b560 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b570 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2b580 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b590 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
2b5a0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
2b5b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2b5c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b5d0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2b5e0 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
2b5f0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2b600 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
2b610 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
2b620 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
2b630 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2b640 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
2b650 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
2b660 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
2b670 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b680 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
2b690 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2b6a0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
2b6b0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b6c0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
2b6d0 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2b6e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2b6f0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2b700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2b710 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
2b720 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
2b730 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2b740 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
2b750 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
2b760 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
2b770 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
2b780 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2b790 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2b7a0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2b7b0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
2b7c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2b7d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2b7e0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2b7f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2b800 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74  .  }...  /* Writ
2b810 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
2b820 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2b830 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2b840 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68  nd open .  ** th
2b850 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
2b860 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2b870 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
2b890 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
2b8a0 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
2b8b0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
2b8c0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
2b8d0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
2b8e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2b8f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2b900 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
2b910 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2b920 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2b930 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
2b940 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2b950 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
2b960 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
2b970 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
2b980 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
2b990 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
2b9a0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
2b9b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
2b9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b9d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
2b9e0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
2b9f0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
2ba00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2ba10 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
2ba20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ba30 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
2ba40 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2ba50 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2ba60 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
2ba70 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
2ba80 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2ba90 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
2baa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2bab0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
2bac0 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
2bad0 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
2bae0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
2baf0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
2bb00 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
2bb10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2bb20 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
2bb30 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
2bb40 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
2bb50 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2bb60 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
2bb70 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
2bb80 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
2bb90 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
2bba0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
2bbb0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
2bbc0 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
2bbd0 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68  ory file and, th
2bbe0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2bbf0 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20  s .** opened if 
2bc00 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  it has not been 
2bc10 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74  already. For a t
2bc20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74  emporary file, t
2bc30 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f  he opening .** o
2bc40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2bc50 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
2bc60 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
2bc70 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
2bc80 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
2bc90 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20   journal. TODO: 
2bca0 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f  Why handle tempo
2bcb0 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65  rary files diffe
2bcc0 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66  rently?.**.** If
2bcd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2bce0 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20  e is opened (or 
2bcf0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
2bd00 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a   open), then a.*
2bd10 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  * journal-header
2bd20 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
2bd30 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a  he start of it..
2bd40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
2bd50 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
2bd60 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
2bd70 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
2bd80 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
2bd90 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
2bda0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
2bdb0 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2bdc0 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
2bdd0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
2bde0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
2bdf0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
2be00 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
2be10 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
2be20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
2be30 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
2be40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
2be50 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
2be60 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
2be70 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
2be80 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
2be90 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
2bea0 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
2beb0 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
2bec0 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
2bed0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
2bee0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2bef0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
2bf00 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
2bf10 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
2bf20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2bf30 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
2bf40 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
2bf50 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
2bf60 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
2bf70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2bf80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2bf90 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
2bfa0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
2bfb0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
2bfc0 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
2bfd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2bfe0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
2bff0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2c000 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2c010 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
2c020 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
2c030 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2c040 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  e );..    if( pa
2c050 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2c060 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
2c070 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
2c080 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
2c090 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2c0a0 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
2c0b0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
2c0c0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
2c0d0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
2c0e0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
2c0f0 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
2c100 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
2c110 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2c120 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
2c130 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
2c140 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
2c150 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c160 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
2c170 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
2c180 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2c190 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
2c1a0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
2c1b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2c1c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c1d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c1e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2c1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2c200 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
2c210 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
2c220 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2c230 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
2c240 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
2c250 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
2c260 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
2c270 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
2c280 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
2c290 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
2c2a0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
2c2b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
2c2c0 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
2c2d0 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
2c2e0 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
2c2f0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
2c300 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
2c310 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
2c320 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
2c330 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
2c340 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
2c350 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2c360 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
2c370 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f 20 50  Pager.state to P
2c380 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 77 68  AGER_RESERVED wh
2c390 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
2c3a0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  n.      ** trans
2c3b0 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
2c3c0 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  r to PAGER_EXCLU
2c3d0 53 49 56 45 2e 20 54 68 69 73 20 69 73 20 62 65  SIVE. This is be
2c3e0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
2c3f0 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ** PAGER_EXCLUSI
2c400 56 45 20 73 74 61 74 65 20 74 68 65 20 63 6f 64  VE state the cod
2c410 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
2c420 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
2c430 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d  tions.      ** m
2c440 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
2c450 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
2c460 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
2c470 61 73 65 20 66 69 6c 65 20 61 73 20 77 65 6c 6c  ase file as well
2c480 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 6e 74  .      ** as int
2c490 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
2c4a0 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
2c4b0 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 57 41   incorrect in WA
2c4c0 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
2c4d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c4e0 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
2c4f0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2c500 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20  er->pWal);.     
2c510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
2c530 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2c540 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2c550 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
2c560 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c570 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
2c580 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c590 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
2c5a0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2c5b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c5c0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c5d0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2c5e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2c5f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c600 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c610 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
2c620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c630 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
2c640 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
2c650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c660 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
2c670 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
2c680 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
2c690 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
2c6a0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
2c6b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2c6c0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
2c6d0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
2c6e0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
2c6f0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
2c700 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
2c710 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
2c720 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
2c730 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
2c740 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
2c750 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2c760 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
2c770 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
2c780 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2c790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c7a0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2c7b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2c7c0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
2c7d0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
2c7e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2c7f0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2c800 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
2c810 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2c820 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c830 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65   }..    /* No ne
2c840 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ed to open the j
2c850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
2c860 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69  his time.  It wi
2c870 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65  ll be.    ** ope
2c880 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  ned before it is
2c890 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66   written to.  If
2c8a0 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e   we defer openin
2c8b0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20  g the journal,. 
2c8c0 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73     ** we might s
2c8d0 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  ave the work of 
2c8e0 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
2c8f0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2c900 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75  on.    ** ends u
2c910 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e  p being a no-op.
2c920 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 28  .    */..    if(
2c930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c940 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c950 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2c960 69 65 64 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  ied );.      /* 
2c970 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72  Ignore any IO er
2c980 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  ror that occurs 
2c990 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e 64  within pager_end
2c9a0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20  _transaction(). 
2c9b0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 75 72  The.      ** pur
2c9c0 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
2c9d0 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68  l is to reset th
2c9e0 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
2c9f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20   of the pager.  
2ca00 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65      ** sub-syste
2ca10 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61  m. It doesn't ma
2ca20 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72  tter if the jour
2ca30 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
2ca40 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 20 20 2a  properly.      *
2ca50 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74  * finalized at t
2ca60 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65  his point (since
2ca70 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c   it is not a val
2ca80 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
2ca90 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 20 20 2a  anyway)..      *
2caa0 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  /.      pager_en
2cab0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2cac0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
2cad0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2cae0 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E(("TRANSACTION 
2caf0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2cb00 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75  Pager)));.  retu
2cb10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2cb20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
2cb30 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
2cb40 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
2cb50 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
2cb60 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
2cb70 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
2cb80 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
2cb90 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
2cba0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
2cbb0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
2cbc0 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
2cbd0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
2cbe0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
2cbf0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2cc00 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
2cc10 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
2cc20 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
2cc30 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
2cc40 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
2cc50 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2cc60 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
2cc70 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2cc80 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
2cc90 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
2cca0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2ccb0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
2ccc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ccd0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
2cce0 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
2ccf0 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  ed unless a tran
2cd00 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2cd10 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74  ady been.  ** st
2cd20 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  arted..  */.  as
2cd30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2cd40 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2cd50 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
2cd60 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
2cd70 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
2cd80 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
2cd90 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
2cda0 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  * again..  */.  
2cdb0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2cdc0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65  ->errCode) )  re
2cdd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2cde0 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68  Code;..  /* High
2cdf0 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er-level routine
2ce00 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69  s never call thi
2ce10 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61  s function if da
2ce20 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20  tabase is not.  
2ce30 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75  ** writable.  Bu
2ce40 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20  t check anyway, 
2ce50 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e  just for robustn
2ce60 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
2ce70 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64  VER(pPager->read
2ce80 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53  Only) ) return S
2ce90 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61  QLITE_PERM;..  a
2cea0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2ceb0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
2cec0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
2ced0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2cee0 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
2cef0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
2cf00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2cf10 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
2cf20 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
2cf30 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
2cf40 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
2cf50 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2cf60 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
2cf70 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
2cf80 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
2cf90 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2cfa0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2cfb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2cfc0 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
2cfd0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2cfe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
2cff0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
2d000 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
2d010 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2d020 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2d030 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2d040 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2d050 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
2d060 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
2d070 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
2d080 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68    **.    ** High
2d090 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
2d0a0 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  s should have al
2d0b0 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61 20  ready started a 
2d0c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20  transaction,.   
2d0d0 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20   ** which means 
2d0e0 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69 72  they have acquir
2d0f0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
2d100 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72   locks but the r
2d110 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2d120 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
2d130 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   yet be open..  
2d140 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2d150 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2d160 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
2d170 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2d180 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 0a 20  >pInJournal==0. 
2d190 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
2d1a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2d1b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2d1c0 46 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  F .     && !page
2d1d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 0a  rUseWal(pPager).
2d1e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
2d1f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2d200 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
2d210 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
2d220 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
2d230 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d240 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2d250 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2d260 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2d270 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
2d280 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
2d290 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
2d2a0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
2d2b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
2d2c0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
2d2d0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
2d2e0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
2d2f0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
2d300 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
2d310 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
2d320 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
2d330 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
2d340 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
2d350 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
2d360 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
2d370 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2d380 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
2d390 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
2d3a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
2d3b0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
2d3c0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
2d3d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2d3e0 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
2d3f0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2d400 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
2d410 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
2d420 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
2d430 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
2d440 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2d450 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
2d460 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
2d470 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
2d480 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
2d490 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
2d4a0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
2d4b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2d4c0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
2d4d0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
2d4e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2d4f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
2d500 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
2d510 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20  rnalOff );.     
2d520 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2d530 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
2d540 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
2d550 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
2d560 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  a2);.        cks
2d570 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
2d580 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
2d590 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72  ata2);.        r
2d5a0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2d5b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2d5c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
2d5d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2d5e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2d5f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d610 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2d620 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2d630 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
2d660 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2d670 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
2d680 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d690 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
2d6a0 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
2d6b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d6d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d6e0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2d6f0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
2d700 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
2d710 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  um);.          p
2d720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d730 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
2d740 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
2d750 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
2d760 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
2d770 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
2d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d790 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d7a0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
2d7b0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
2d7c0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
2d7d0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
2d7e0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
2d7f0 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
2d800 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
2d810 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
2d820 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
2d830 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
2d840 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2d850 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
2d860 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
2d870 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
2d880 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
2d890 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
2d8a0 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
2d8b0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
2d8c0 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  ll error occurre
2d8d0 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  d while journall
2d8e0 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
2d8f0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
2d900 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
2d910 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
2d920 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
2d930 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
2d940 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
2d950 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
2d960 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
2d970 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
2d980 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
2d990 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
2d9a0 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
2d9b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
2d9c0 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
2d9d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2d9e0 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
2d9f0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2da00 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
2da10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2da20 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
2da30 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
2da40 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
2da50 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2da60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
2da70 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
2da80 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
2da90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
2daa0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
2dab0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2dac0 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
2dad0 63 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74  curred writing t
2dae0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2daf0 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  le. The .       
2db00 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
2db10 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
2db20 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
2db30 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
2db40 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
2db50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2db60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2db70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
2db80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2db90 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
2dba0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2dbb0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
2dbc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2dbd0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
2dbe0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2dbf0 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
2dc00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dc10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
2dc20 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
2dc30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2dc40 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
2dc50 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2dc60 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
2dc70 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2dc80 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2dc90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2dca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2dcb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2dcc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
2dcd0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
2dce0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2dcf0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2dd00 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
2dd10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
2dd20 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
2dd30 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
2dd40 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
2dd50 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
2dd60 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  NC;.          pP
2dd70 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
2dd80 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2dd90 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2dda0 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
2ddb0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
2ddc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2ddd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2dde0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
2ddf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2de00 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
2de10 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
2de20 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
2de30 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
2de40 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
2de50 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
2de60 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
2de70 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
2de80 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
2de90 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
2dea0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
2deb0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
2dec0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
2ded0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
2dee0 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
2def0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
2df00 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
2df10 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
2df20 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
2df30 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
2df40 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
2df50 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2df60 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2df70 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2df80 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
2df90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
2dfa0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
2dfb0 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
2dfc0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2dfd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2dfe0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
2dff0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2e000 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
2e010 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
2e020 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
2e030 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e040 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
2e050 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
2e060 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
2e070 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
2e080 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
2e090 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
2e0a0 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
2e0b0 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
2e0c0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
2e0d0 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
2e0e0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
2e0f0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
2e100 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
2e110 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
2e120 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2e130 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
2e140 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2e150 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2e160 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
2e170 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
2e180 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
2e190 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
2e1a0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
2e1b0 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
2e1c0 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
2e1d0 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
2e1e0 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
2e1f0 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
2e200 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
2e210 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
2e220 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
2e230 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
2e240 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2e250 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2e260 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
2e270 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
2e280 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2e290 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
2e2a0 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
2e2b0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
2e2c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e2d0 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
2e2e0 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
2e2f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2e300 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
2e310 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
2e320 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2e330 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
2e340 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
2e350 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2e360 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
2e370 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  ize);..  if( nPa
2e380 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
2e390 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
2e3a0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
2e3b0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2e3c0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2e3d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
2e3e0 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
2e3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2e400 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
2e410 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
2e420 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
2e430 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
2e440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e450 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
2e460 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
2e470 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
2e480 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2e490 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2e4a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2e4b0 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
2e4c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2e4d0 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
2e4e0 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
2e4f0 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
2e500 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70   the doNotSyncSp
2e510 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ill flag to 1. T
2e520 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
2e530 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
2e540 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20     ** a journal 
2e550 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
2e560 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
2e570 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
2e580 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   by.    ** this 
2e590 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
2e5a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
2e5b0 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
2e5c0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
2e5d0 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  SyncSpill==0 );.
2e5e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
2e5f0 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20  tSyncSpill++;.. 
2e600 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
2e610 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
2e620 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
2e630 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
2e640 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
2e650 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
2e660 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
2e670 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
2e680 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
2e690 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2e6a0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
2e6b0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
2e6c0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
2e6d0 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
2e6e0 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
2e6f0 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
2e700 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e710 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2e720 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26  pPager, (int *)&
2e730 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20  nPageCount);.   
2e740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
2e760 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
2e770 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
2e780 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
2e790 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
2e7a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
2e7b0 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
2e7c0 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
2e7d0 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20  {.        nPage 
2e7e0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
2e7f0 67 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g1;.      }else{
2e800 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
2e810 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
2e820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2e830 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
2e840 20 20 20 20 20 20 61 73 73 65 72 74 28 70 67 31        assert(pg1
2e850 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
2e860 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
2e870 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
2e880 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
2e890 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2e8a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2e8b0 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
2e8c0 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
2e8d0 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
2e8e0 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
2e8f0 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
2e900 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2e910 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2e920 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
2e930 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
2e940 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
2e950 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
2e960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e970 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
2e980 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
2e990 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e9a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e9b0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2e9c0 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e9e0 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
2e9f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
2ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
2ea10 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2ea20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ea30 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2ea40 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
2ea50 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
2ea60 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2ea70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2ea80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ea90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2eaa0 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
2eab0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
2eac0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
2ead0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
2eae0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2eaf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
2eb00 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
2eb10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2eb20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2eb30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
2eb40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2eb50 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
2eb60 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20  YNC flag is set 
2eb70 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
2eb80 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
2eb90 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
2eba0 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
2ebb0 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
2ebc0 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
2ebd0 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
2ebe0 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
2ebf0 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
2ec00 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
2ec10 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
2ec20 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
2ec30 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
2ec40 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
2ec50 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
2ec60 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
2ec70 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
2ec80 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
2ec90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2eca0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2ecb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65  =SQLITE_OK && ne
2ecc0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
2ecd0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
2ece0 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
2ecf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
2ed00 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
2ed10 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2ed20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
2ed30 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
2ed40 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
2ed50 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
2ed60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2ed70 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
2ed80 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2ed90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2eda0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2edb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2edc0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2edd0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2ede0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  );.    }..    as
2edf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
2ee00 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20  NotSyncSpill==1 
2ee10 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2ee20 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b  oNotSyncSpill--;
2ee30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2ee40 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
2ee50 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
2ee60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ee70 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2ee80 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
2ee90 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2eea0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
2eeb0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
2eec0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2eed0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2eee0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
2eef0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
2ef00 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
2ef10 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
2ef20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
2ef30 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
2ef40 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
2ef50 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
2ef60 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
2ef70 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
2ef80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
2ef90 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
2efa0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
2efb0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
2efc0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
2efd0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
2efe0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
2eff0 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
2f000 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
2f010 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
2f020 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
2f030 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
2f040 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
2f050 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
2f060 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2f070 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
2f080 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2f090 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
2f0a0 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
2f0b0 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
2f0c0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
2f0d0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
2f0e0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
2f0f0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
2f100 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
2f110 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
2f120 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
2f130 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
2f140 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
2f150 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
2f160 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
2f170 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
2f180 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
2f190 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
2f1a0 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
2f1b0 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
2f1c0 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2f1d0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2f1e0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2f1f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2f200 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2f210 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2f220 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
2f230 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
2f240 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2f250 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
2f260 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
2f270 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
2f280 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
2f290 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2f2a0 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
2f2b0 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
2f2c0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
2f2d0 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
2f2e0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
2f2f0 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66  NT_WRITE;.#ifdef
2f300 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
2f310 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
2f320 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
2f330 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
2f340 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
2f350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2f360 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
2f370 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
2f380 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2f390 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
2f3a0 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
2f3b0 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
2f3c0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
2f3d0 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
2f3e0 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
2f3f0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2f400 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44  **.** If the isD
2f410 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69  irectMode flag i
2f420 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
2f430 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c  s is done by cal
2f440 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
2f450 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
2f460 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64  page 1, then mod
2f470 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
2f480 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  nts of the.** pa
2f490 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73  ge data. In this
2f4a0 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77   case the file w
2f4b0 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77  ill be updated w
2f4c0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2f4d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2f4e0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
2f4f0 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d  ** The isDirectM
2f500 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c  ode flag may onl
2f510 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  y be non-zero if
2f520 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73   the library was
2f530 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74   compiled.** wit
2f540 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
2f550 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2f560 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
2f570 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a  In this case,.**
2f580 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20   if isDirect is 
2f590 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
2f5a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f5b0 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65   is updated dire
2f5c0 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69  ctly.** by writi
2f5d0 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65  ng an updated ve
2f5e0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
2f5f0 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
2f600 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  the .** sqlite3O
2f610 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  sWrite() functio
2f620 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2f630 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2f640 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
2f650 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
2f660 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e  irectMode){.  in
2f670 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f680 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20  ;..  /* Declare 
2f690 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  and initialize c
2f6a0 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
2f6b0 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74  'isDirect'. If t
2f6c0 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77  he.  ** atomic-w
2f6d0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2f6e0 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20  n is enabled in 
2f6f0 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e  this build, then
2f700 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69   isDirect.  ** i
2f710 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
2f720 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
2f730 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63  d as the isDirec
2f740 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a  tMode parameter.
2f750 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e    ** to this fun
2f760 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2f770 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73  , it is always s
2f780 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  et to zero..  **
2f790 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69  .  ** The idea i
2f7a0 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74  s that if the at
2f7b0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2f7c0 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  ization is not. 
2f7d0 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63   ** enabled at c
2f7e0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2f7f0 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d   compiler can om
2f800 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a  it the tests of.
2f810 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20    ** 'isDirect' 
2f820 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61  below, as well a
2f830 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c  s the block encl
2f840 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  osed in the.  **
2f850 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29   "if( isDirect )
2f860 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a  " condition..  *
2f870 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f880 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2f890 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49  RITE.# define DI
2f8a0 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73  RECT_MODE 0.  as
2f8b0 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f  sert( isDirectMo
2f8c0 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  de==0 );.  UNUSE
2f8d0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69  D_PARAMETER(isDi
2f8e0 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65  rectMode);.#else
2f8f0 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
2f900 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f  _MODE isDirectMo
2f910 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  de.#endif..  ass
2f920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2f930 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
2f940 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ED );.  if( !pPa
2f950 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2f960 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Done && pPager->
2f970 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
2f980 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20  PgHdr *pPgHdr;  
2f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f9a0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   Reference to pa
2f9b0 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20  ge 1 */.    u32 
2f9c0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20  change_counter; 
2f9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
2f9e0 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68  tial value of ch
2f9f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
2fa00 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ld */..    asser
2fa10 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
2fa20 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70  File && isOpen(p
2fa30 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
2fa40 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
2fa50 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
2fa60 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
2fa70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fa80 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
2fa90 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
2faa0 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d  assert( pPgHdr==
2fab0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
2fac0 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  OK );..    /* If
2fad0 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65   page one was fe
2fae0 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c  tched successful
2faf0 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ly, and this fun
2fb00 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20  ction is not.   
2fb10 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   ** operating in
2fb20 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61   direct-mode, ma
2fb30 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62  ke page 1 writab
2fb40 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e  le.  When not in
2fb50 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20   .    ** direct 
2fb60 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20  mode, page 1 is 
2fb70 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63  always held in c
2fb80 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74  ache and hence t
2fb90 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20  he PagerGet().  
2fba0 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c    ** above is al
2fbb0 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20  ways successful 
2fbc0 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41  - hence the ALWA
2fbd0 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45  YS on rc==SQLITE
2fbe0 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _OK..    */.    
2fbf0 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45  if( !DIRECT_MODE
2fc00 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53   && ALWAYS(rc==S
2fc10 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20  QLITE_OK) ){.   
2fc20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fc30 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
2fc40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2fc50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fc60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  ){.      /* Incr
2fc70 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
2fc80 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
2fc90 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
2fca0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20  yte 24. */.     
2fcb0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
2fcc0 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
2fcd0 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
2fce0 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
2fcf0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2fd00 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  ++;.      put32b
2fd10 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
2fd20 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
2fd30 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
2fd40 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73  .      /* Also s
2fd50 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
2fd60 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
2fd70 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
2fd80 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  nd in.      ** b
2fd90 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
2fda0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
2fdb0 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
2fdc0 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
2fdd0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61  r.      ** is va
2fde0 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75  lid. */.      pu
2fdf0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
2fe00 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39  pPgHdr->pData)+9
2fe10 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  2, change_counte
2fe20 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  r);.      put32b
2fe30 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
2fe40 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  dr->pData)+96, S
2fe50 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
2fe60 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  MBER);..      /*
2fe70 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64   If running in d
2fe80 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74  irect mode, writ
2fe90 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2fea0 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20  f page 1 to the 
2feb0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
2fec0 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29  f( DIRECT_MODE )
2fed0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2fee0 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20  void *zBuf;.    
2fef0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ff00 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30  er->dbFileSize>0
2ff10 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
2ff20 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64  C2(pPager, pPgHd
2ff30 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20  r->pData, 1, 6, 
2ff40 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
2ff50 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20   zBuf);.        
2ff60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ff70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2ff80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2ff90 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
2ffa0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
2ffb0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
2ffc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2ffd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ffe0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2fff0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
30000 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
30010 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
30020 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
30030 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
30040 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
30050 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
30060 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
30070 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
30080 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30090 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  pPgHdr);.  }.  r
300a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
300b0 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
300c0 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20  r file to disk. 
300d0 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
300e0 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  for in-memory fi
300f0 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  les.** or pages 
30100 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
30110 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
30120 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
30130 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f  ful, or called o
30140 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
30150 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
30160 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
30170 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
30180 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
30190 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
301a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
301b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
301c0 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
301d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
301e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
301f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30200 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30210 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
30220 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
30230 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
30240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
30260 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
30270 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
30280 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
30290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
302a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
302b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
302c0 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
302d0 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
302e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
302f0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
30300 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
30310 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
30320 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
30330 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
30340 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
30350 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
30360 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
30370 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
30380 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
30390 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
303a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
303b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
303c0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
303d0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
303e0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
303f0 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
30400 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
30410 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
30420 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
30430 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
30440 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
30450 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
30460 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
30470 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
30480 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
30490 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
304a0 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
304b0 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
304c0 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
304d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
304e0 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
304f0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
30500 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
30510 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30520 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
30530 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
30540 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
30550 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
30560 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
30570 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
30580 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
30590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
305a0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
305b0 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
305c0 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
305d0 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
305e0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
305f0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
30600 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
30610 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
30620 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
30630 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
30640 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
30650 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
30660 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30670 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
30680 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
30690 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
306a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
306b0 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
306c0 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
306d0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
306e0 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
306f0 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
30700 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
30710 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
30720 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
30730 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
30740 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
30750 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
30760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30770 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
30780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
30790 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
307a0 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
307b0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
307c0 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
307d0 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
307e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
307f0 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
30800 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
30810 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
30820 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30840 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30850 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53    /* The dbOrigS
30860 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74  ize is never set
30870 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
30880 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74  =OFF */.  assert
30890 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
308a0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
308b0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
308c0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
308d0 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ze==0 );..  /* I
308e0 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
308f0 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74  occurred, report
30900 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69   that error agai
30910 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  n. */.  if( pPag
30920 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
30930 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
30940 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52  Code;..  PAGERTR
30950 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
30960 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
30970 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
30980 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
30990 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
309a0 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
309b0 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28  dbSize));..  if(
309c0 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
309d0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
309e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
309f0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
30a00 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
30a10 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
30a20 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
30a30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
30a40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
30a50 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
30a60 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
30a70 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
30a80 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
30a90 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
30aa0 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
30ab0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
30ac0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
30ad0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
30ae0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
30af0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
30b00 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  NCED && pPager->
30b10 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
30b20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
30b30 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
30b40 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
30b50 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
30b60 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
30b70 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
30b80 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
30b90 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30ba0 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
30bb0 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d  , pList, pPager-
30bc0 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20  >dbSize, 1, .   
30bd0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
30be0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61  ->fullSync ? pPa
30bf0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
30c00 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
30c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30c30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30c40 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
30c50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
30c80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
30c90 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
30ca0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
30cb0 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
30cc0 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
30cd0 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
30ce0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
30cf0 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
30d00 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20  imization.      
30d10 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
30d20 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
30d30 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
30d40 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
30d50 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74  e .      ** runt
30d60 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
30d70 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
30d80 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  n: .      **.   
30d90 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66     **    * The f
30da0 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
30db0 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
30dc0 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
30dd0 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
30de0 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
30df0 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20  age-size, and . 
30e00 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69       **    * Thi
30e10 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
30e20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
30e30 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
30e40 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20  , and.      **  
30e50 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
30e60 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
30e70 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
30e80 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
30e90 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
30ea0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f       ** If the o
30eb0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
30ec0 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
30ed0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
30ee0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  n the.      ** p
30ef0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
30f00 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
30f10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
30f20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
30f30 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  e.      ** count
30f40 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
30f50 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
30f60 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
30f70 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
30f80 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70      ** is not ap
30f90 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73  plicable to this
30fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61   transaction, ca
30fb0 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  ll sqlite3Journa
30fc0 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20 20  lCreate().      
30fd0 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** to make sure 
30fe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30ff0 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
31000 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  en created, then
31010 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70   call.      ** p
31020 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
31030 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
31040 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
31050 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65  ounter in indire
31060 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  ct.      ** mode
31070 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
31080 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
31090 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
310a0 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
310b0 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
310c0 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  le,.      ** the
310d0 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
310e0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
310f0 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
31100 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
31110 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65       ** in 'dire
31120 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
31130 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
31140 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
31150 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63  er be.      ** c
31160 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
31170 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
31180 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53     */.  #ifdef S
31190 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
311a0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
311b0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
311c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
311d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
311e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
311f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
31200 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31210 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
31220 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
31230 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
31240 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
31250 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
31260 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26    if( !zMaster &
31270 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
31280 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 26 26  >jfd) .       &&
31290 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
312a0 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
312b0 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20  ize(pPager) .   
312c0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64      && pPager->d
312d0 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64  bSize>=pPager->d
312e0 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 20  bFileSize.      
312f0 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73   && (0==(pPg = s
31300 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
31310 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
31320 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50  Cache)) || 0==pP
31330 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 20  g->pDirty).     
31340 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55   ){.        /* U
31350 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
31360 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
31370 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
31380 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
31390 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
313a0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
313b0 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d  l modify the in-
313c0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
313d0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
313e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
313f0 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74  nclude the updat
31400 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ed change counte
31410 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  r and then write
31420 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20   page 1 .       
31430 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
31440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31450 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
31460 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a  e atomic-write .
31470 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65          ** prope
31480 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
31490 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69  file-system, thi
314a0 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
314b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
314c0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
314d0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
314e0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  er, 1);.      }e
314f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
31500 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
31510 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
31520 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
31530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31540 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31550 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
31560 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
31570 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
31580 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a        }.  #else.
31590 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
315a0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
315b0 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
315c0 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69    #endif.      i
315d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
315e0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
315f0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
31600 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
31610 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
31620 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
31630 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
31640 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
31650 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
31660 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
31670 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
31680 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
31690 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
316a0 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  file. This can o
316b0 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75  nly happen in au
316c0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a  to-vacuum mode..
316d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
316e0 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67  * Before reading
316f0 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20   the pages with 
31700 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72  page numbers lar
31710 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
31720 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
31730 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
31740 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
31750 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
31760 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ue.      ** that
31770 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
31780 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
31790 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
317a0 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ise, the.      *
317b0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
317c0 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65 74  e3PagerGet() ret
317d0 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73  urn zeroed pages
317e0 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20   instead of .   
317f0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61     ** reading da
31800 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
31810 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
31820 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 68 65   **.      ** Whe
31830 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d  n journal_mode==
31840 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69  OFF the dbOrigSi
31850 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  ze is always zer
31860 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 20  o, so this.     
31870 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20   ** block never 
31880 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f  runs if journal_
31890 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20  mode=OFF..      
318a0 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c  */.  #ifndef SQL
318b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
318c0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50  UUM.      if( pP
318d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
318e0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
318f0 0a 20 20 20 20 20 20 20 26 26 20 41 4c 57 41 59  .       && ALWAY
31900 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  S(pPager->journa
31910 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
31920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20  RNALMODE_OFF).  
31930 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50      ){.        P
31940 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20  gno i;          
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
31970 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
31980 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
31990 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
319a0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
319b0 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
319c0 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
319d0 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62     const Pgno db
319e0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
319f0 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  bSize;       /* 
31a00 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73  Database image s
31a10 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ize */ .        
31a20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
31a30 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
31a40 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ize;.        for
31a50 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c  ( i=dbSize+1; i<
31a60 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
31a70 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
31a80 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
31a90 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
31aa0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
31ab0 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
31ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50  ){.            P
31ad0 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20  gHdr *pPage;    
31ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31af0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
31b00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31b10 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31b20 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
31b30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
31b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31b50 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
31b60 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
31b70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31b90 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
31ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
31bb0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
31bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31bd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31be0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31bf0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31c10 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
31c20 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
31c30 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23  ze;.      } .  #
31c40 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f  endif.  .      /
31c50 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
31c60 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
31c70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
31c80 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74   file. If a mast
31c90 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  er .      ** jou
31ca0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
31cb0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
31cc0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
31cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20  ournal file, .  
31ce0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61      ** or if zMa
31cf0 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f  ster is NULL (no
31d00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29   master journal)
31d10 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
31d20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
31d30 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31d40 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
31d50 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
31d60 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
31d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
31d80 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
31d90 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
31da0 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65       /* Sync the
31db0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
31dc0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
31dd0 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
31de0 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
31df0 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61  ** used, this ca
31e00 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61  ll will not crea
31e10 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
31e20 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61  ile or perform a
31e30 6e 79 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 6c  ny.      ** real
31e40 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   IO..      */.  
31e50 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
31e60 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
31e70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31e80 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
31e90 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
31ea0 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
31eb0 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
31ec0 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
31ed0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
31ee0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31ef0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73  write_pagelist(s
31f00 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
31f10 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
31f20 43 61 63 68 65 29 29 3b 0a 20 20 20 20 20 20 69  Cache));.      i
31f30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31f40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
31f50 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
31f60 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a  OERR_BLOCKED );.
31f70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d          goto com
31f80 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
31f90 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
31fa0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
31fb0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
31fc0 70 50 43 61 63 68 65 29 3b 0a 20 20 0a 20 20 20  pPCache);.  .   
31fd0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
31fe0 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74  e on disk is not
31ff0 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
32000 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  s the database i
32010 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mage,.      ** t
32020 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72  hen use pager_tr
32030 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f  uncate to grow o
32040 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c  r shrink the fil
32050 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
32060 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
32070 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65  r->dbSize!=pPage
32080 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
32090 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e  .        Pgno nN
320a0 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ew = pPager->dbS
320b0 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64  ize - (pPager->d
320c0 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f  bSize==PAGER_MJ_
320d0 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
320e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
320f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
32100 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
32110 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
32120 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
32130 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ger, nNew);.    
32140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32150 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
32160 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
32170 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  it;.      }.  . 
32180 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c       /* Finally,
32190 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
321a0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
321b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
321c0 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
321d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
321e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
321f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
32200 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
32210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
32220 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
32230 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
32240 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
32250 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
32260 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d  SYNCED;.  }..com
32270 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
32280 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
32290 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  .}.../*.** When 
322a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
322b0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74   called, the dat
322c0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
322d0 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a  een completely.*
322e0 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66  * updated to ref
322f0 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73  lect the changes
32300 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72   made by the cur
32310 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
32320 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74   and.** synced t
32330 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72  o disk. The jour
32340 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  nal file still e
32350 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
32360 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f  e-system .** tho
32370 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61  ugh, and if a fa
32380 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20  ilure occurs at 
32390 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69  this point it wi
323a0 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  ll eventually.**
323b0 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f   be used as a ho
323c0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t-journal and th
323d0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
323e0 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63  ction rolled bac
323f0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
32400 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73  nction finalizes
32410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32420 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c  e, either by del
32430 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63  eting, .** trunc
32440 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c  ating or partial
32450 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73  ly zeroing it, s
32460 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74  o that it cannot
32470 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
32480 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
32490 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73  lback. Once this
324a0 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61   is done the tra
324b0 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69  nsaction is.** i
324c0 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69  rrevocably commi
324d0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
324e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
324f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
32500 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
32510 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f   the pager.** mo
32520 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ves into the err
32530 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  or state. Otherw
32540 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
32550 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
32560 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
32570 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
32580 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
32590 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
325a0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
325b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
325c0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
325d0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
325e0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
325f0 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
32600 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  has occurred..  
32610 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20 74  ** But if (due t
32620 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
32630 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68   elsewhere in th
32640 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65  e system) it doe
32650 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65  s get.  ** calle
32660 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  d, just return t
32670 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f  he same error co
32680 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  de without doing
32690 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20   anything. */.  
326a0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
326b0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
326c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
326d0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ode;..  /* This 
326e0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
326f0 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
32700 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
32710 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20  t in at least.  
32720 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
32730 44 20 73 74 61 74 65 2e 20 2a 2a 46 49 58 4d 45  D state. **FIXME
32740 2a 2a 3a 20 4d 61 6b 65 20 69 74 20 73 6f 20 74  **: Make it so t
32750 68 61 74 20 74 68 69 73 20 74 65 73 74 20 61 6c  hat this test al
32760 77 61 79 73 0a 20 20 2a 2a 20 66 61 69 6c 73 20  ways.  ** fails 
32770 2d 20 6d 61 6b 65 20 69 74 20 73 6f 20 74 68 61  - make it so tha
32780 74 20 77 65 20 6e 65 76 65 72 20 72 65 61 63 68  t we never reach
32790 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66 20 77   this point if w
327a0 65 20 64 6f 20 6e 6f 74 20 68 6f 6c 64 0a 20 20  e do not hold.  
327b0 2a 2a 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79  ** all necessary
327c0 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69   locks..  */.  i
327d0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
327e0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
327f0 45 52 56 45 44 29 20 29 20 72 65 74 75 72 6e 20  ERVED) ) return 
32800 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
32810 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
32820 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
32830 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
32840 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
32850 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
32860 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
32870 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
32880 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
32890 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20  ode and is.  ** 
328a0 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74  using persistent
328b0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
328c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
328d0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
328e0 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66   ** The start of
328f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32900 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
32910 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f  ains a single jo
32920 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
32930 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  er with the nRec
32940 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e   field set to 0.
32950 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e   If such a journ
32960 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20  al is used as.  
32970 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
32980 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
32990 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20  nal rollback, 0 
329a0 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
329b0 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  made.  ** to the
329c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
329d0 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  So there is no n
329e0 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20  eed to zero the 
329f0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
32a00 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20  ader. Since the 
32a10 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
32a20 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72  usive mode, ther
32a30 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a  e is no need.  *
32a40 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f  * to drop any lo
32a50 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f  cks either..  */
32a60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
32a70 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20  bModified==0 && 
32a80 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32a90 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61  eMode .   && pPa
32aa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
32ab0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32ac0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b  ODE_PERSIST.  ){
32ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32ae0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
32af0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
32b00 70 50 61 67 65 72 29 20 7c 7c 20 21 70 50 61 67  pPager) || !pPag
32b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
32b20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
32b30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
32b40 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
32b50 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
32b60 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
32b70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
32b80 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
32b90 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
32ba0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
32bb0 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
32bc0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
32bd0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
32be0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
32bf0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
32c00 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
32c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
32c20 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
32c30 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
32c40 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
32c50 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
32c60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32c70 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
32c80 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
32c90 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
32ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
32cb0 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
32cc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
32cd0 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
32ce0 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
32cf0 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
32d00 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
32d10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
32d20 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
32d30 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
32d40 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
32d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
32d60 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
32d70 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
32d80 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
32d90 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
32da0 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
32db0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
32dc0 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
32dd0 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
32de0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
32df0 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
32e00 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
32e10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
32e20 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
32e30 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
32e40 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
32e50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
32e60 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
32e70 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
32e80 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
32e90 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
32ea0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
32eb0 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
32ec0 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
32ed0 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
32ee0 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
32ef0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
32f00 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
32f10 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
32f20 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
32f30 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
32f40 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
32f50 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
32f60 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
32f70 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
32f80 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
32f90 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
32fa0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
32fb0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
32fc0 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
32fd0 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
32fe0 63 65 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cessful, also at
32ff0 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
33000 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
33010 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
33020 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
33030 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
33040 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
33050 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
33060 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
33070 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
33080 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
33090 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
330a0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
330b0 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
330c0 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
330d0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
330e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
330f0 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
33100 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
33110 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
33120 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
33130 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
33140 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
33150 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
33160 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
33170 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
33180 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
33190 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
331a0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
331b0 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
331c0 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
331d0 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
331e0 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
331f0 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
33200 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
33210 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
33220 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
33230 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
33240 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
33250 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
33260 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
33270 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
33280 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
33290 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
332a0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
332b0 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
332c0 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
332d0 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
332e0 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
332f0 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
33300 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
33310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
33320 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
33330 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
33340 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
33350 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
33360 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
33370 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
33380 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
33390 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
333a0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
333b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
333c0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
333d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
333e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
333f0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
33400 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
33410 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
33420 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
33430 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
33440 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 70 61  ger)));.  if( pa
33450 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33460 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  ) ){.    int rc2
33470 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
33480 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
33490 74 28 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f  t(pPager, SAVEPO
334a0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31  INT_ROLLBACK, -1
334b0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
334c0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
334d0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
334e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
334f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33500 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
33510 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
33520 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
33530 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  );.  }else if( !
33540 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
33550 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  ed || !isOpen(pP
33560 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
33570 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
33580 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
33590 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
335a0 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Master);.  }else
335b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
335c0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
335d0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
335e0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
335f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
33600 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
33610 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
33620 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
33630 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
33640 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
33650 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
33660 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
33670 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
33680 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
33690 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  c2;.      rc = p
336a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
336b0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
336c0 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
336d0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
336e0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
336f0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
33700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33710 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
33720 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
33730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
33740 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
33750 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
33760 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
33770 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
33780 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
33790 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
337a0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
337b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
337c0 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
337d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
337e0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
337f0 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
33800 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
33810 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
33820 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
33830 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
33840 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
33850 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
33860 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
33870 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33880 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
33890 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
338a0 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
338b0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
338c0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
338d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
338e0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
338f0 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c  table..*/.u8 sql
33900 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
33910 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
33920 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
33930 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
33940 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33950 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
33960 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
33970 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
33980 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
33990 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
339a0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
339b0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
339c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
339d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
339e0 72 6e 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61  rn the approxima
339f0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  te number of byt
33a00 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72  es of memory cur
33a10 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62  rently.** used b
33a20 79 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  y the pager and 
33a30 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 63  its associated c
33a40 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ache..*/.int sql
33a50 69 74 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64  ite3PagerMemUsed
33a60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33a70 0a 20 20 69 6e 74 20 70 65 72 50 61 67 65 53 69  .  int perPageSi
33a80 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
33a90 65 53 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e  eSize + pPager->
33aa0 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72  nExtra + 20;.  r
33ab0 65 74 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a  eturn perPageSiz
33ac0 65 2a 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  e*sqlite3PcacheP
33ad0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
33ae0 3e 70 50 43 61 63 68 65 29 0a 20 20 20 20 20 20  >pPCache).      
33af0 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61       + sqlite3Ma
33b00 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29  llocSize(pPager)
33b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33b20 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
33b30 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
33b40 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
33b50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33b60 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
33b70 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
33b80 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
33b90 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
33ba0 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
33bb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33bc0 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
33bd0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
33be0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
33bf0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
33c00 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
33c10 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
33c20 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
33c30 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
33c40 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
33c50 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
33c60 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
33c70 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
33c80 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
33c90 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
33ca0 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
33cb0 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
33cc0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33cd0 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
33ce0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
33cf0 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
33d00 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
33d10 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
33d20 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
33d30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
33d40 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
33d50 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
33d60 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
33d70 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
33d80 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
33d90 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
33da0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
33db0 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
33dc0 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
33dd0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
33de0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33df0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
33e00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
33e10 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
33e20 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
33e30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
33e40 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
33e50 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
33e60 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
33e70 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20  east nSavepoint 
33e80 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e  savepoints open.
33e90 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   If there are.**
33ea0 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20   currently less 
33eb0 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73  than nSavepoints
33ec0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
33ed0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
33ee0 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61  epoints.** to ma
33ef0 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72  ke up the differ
33f00 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d  ence. If the num
33f10 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
33f20 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  s is already.** 
33f30 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f  equal to nSavepo
33f40 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  int, then this f
33f50 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
33f60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  op..**.** If a m
33f70 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
33f80 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
33f90 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
33fa0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  . If an error .*
33fb0 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  * occurs while o
33fc0 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a  pening the sub-j
33fd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
33fe0 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  n an IO error co
33ff0 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
34000 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
34010 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
34020 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
34030 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
34040 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
34050 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
34060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
34070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34080 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
34090 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
340a0 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d  urrent = pPager-
340b0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  >nSavepoint;    
340c0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
340d0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
340e0 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53  nts */..  if( nS
340f0 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e  avepoint>nCurren
34100 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
34110 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
34120 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
34130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34140 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
34150 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
34160 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
34170 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20  t *aNew;        
34180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
34190 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  w Pager.aSavepoi
341a0 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  nt array */.    
341b0 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
341c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
341e0 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
341f0 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71   */..    rc = sq
34200 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
34210 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
34220 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
34230 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
34240 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61    /* Grow the Pa
34250 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
34260 72 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c  rray using reall
34270 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  oc(). Return SQL
34280 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a  ITE_NOMEM.    **
34290 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   if the allocati
342a0 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77  on fails. Otherw
342b0 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65  ise, zero the ne
342c0 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73  w portion in cas
342d0 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c  e a .    ** mall
342e0 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
342f0 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69  s while populati
34300 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72  ng it in the for
34310 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77  (...) loop below
34320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65  ..    */.    aNe
34330 77 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f  w = (PagerSavepo
34340 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61  int *)sqlite3Rea
34350 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50  lloc(.        pP
34360 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
34370 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  , sizeof(PagerSa
34380 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f  vepoint)*nSavepo
34390 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  int.    );.    i
343a0 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
343b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
343c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
343d0 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43   memset(&aNew[nC
343e0 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61  urrent], 0, (nSa
343f0 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74  vepoint-nCurrent
34400 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72  ) * sizeof(Pager
34410 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20  Savepoint));.   
34420 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
34430 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a 20 20 20  int = aNew;..   
34440 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
34450 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
34460 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20  structures just 
34470 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
34480 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e    for(ii=nCurren
34490 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74  t; ii<nSavepoint
344a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
344b0 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20  New[ii].nOrig = 
344c0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  nPage;.      if(
344d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
344e0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
344f0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a  journalOff>0 ){.
34500 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
34510 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
34520 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
34530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34540 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
34550 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
34560 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
34570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
34580 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
34590 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
345a0 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
345b0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73  pInSavepoint = s
345c0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
345d0 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  te(nPage);.     
345e0 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
345f0 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
34600 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
34610 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
34620 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 61    }.      if( pa
34630 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
34650 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
34660 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 61  (pPager->pWal, a
34670 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44 61 74 61  New[ii].aWalData
34680 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34690 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
346a0 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20 20 20 20  int = ii+1;.    
346b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
346c0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
346d0 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ==nSavepoint );.
346e0 20 20 20 20 61 73 73 65 72 74 54 72 75 6e 63 61      assertTrunca
346f0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
34700 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
34710 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34720 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
34730 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
34740 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
34750 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70  (commit) a savep
34760 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76  oint..** The sav
34770 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73  epoint to releas
34780 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  e or rollback ne
34790 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f  ed not be the mo
347a0 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20  st recently .** 
347b0 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
347c0 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
347d0 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20  er op is always 
347e0 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
347f0 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56  _ROLLBACK or SAV
34800 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a  EPOINT_RELEASE..
34810 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45  ** If it is SAVE
34820 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
34830 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20  hen release and 
34840 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65  destroy the save
34850 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e  point with.** in
34860 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  dex iSavepoint. 
34870 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
34880 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
34890 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  n rollback all c
348a0 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68  hanges.** that h
348b0 61 76 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e  ave occurred sin
348c0 63 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ce the specified
348d0 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63   savepoint was c
348e0 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  reated..**.** Th
348f0 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72  e savepoint to r
34900 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
34910 73 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  se is identified
34920 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a   by parameter .*
34930 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20  * iSavepoint. A 
34940 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73  value of 0 means
34950 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
34960 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
34970 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66  epoint.** (the f
34980 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20 41  irst created). A
34990 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72   value of (Pager
349a0 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d  .nSavepoint-1) m
349b0 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20  eans operate.** 
349c0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
349d0 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61 76  ntly created sav
349e0 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65  epoint. If iSave
349f0 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
34a00 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e   than.** (Pager.
34a10 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74  nSavepoint-1), t
34a20 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
34a30 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
34a40 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76  .** If a negativ
34a50 65 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  e value is passe
34a60 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
34a70 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  on, then the cur
34a80 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
34a90 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
34aa0 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
34ab0 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67  erent to calling
34ac0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
34ad0 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61  rRollback() beca
34ae0 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
34af0 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69  n does not termi
34b00 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e  nate.** the tran
34b10 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63  saction or unloc
34b20 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
34b30 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73  it just restores
34b40 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
34b50 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
34b60 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
34b70 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  l state. .**.** 
34b80 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c  In any case, all
34b90 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68   savepoints with
34ba0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
34bb0 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e  r than iSavepoin
34bc0 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f  t .** are destro
34bd0 79 65 64 2e 20 49 66 20 74 68 69 73 20 69 73 20  yed. If this is 
34be0 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74  a release operat
34bf0 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49  ion (op==SAVEPOI
34c00 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20  NT_RELEASE),.** 
34c10 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  then savepoint i
34c20 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73  Savepoint is als
34c30 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  o destroyed..**.
34c40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34c50 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
34c60 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65  TE_NOMEM if a me
34c70 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
34c80 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20  fails,.** or an 
34c90 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
34ca0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
34cb0 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  urs while rollin
34cc0 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76  g back a .** sav
34cd0 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72  epoint. If no er
34ce0 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49  rors occur, SQLI
34cf0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
34d00 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
34d10 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
34d20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
34d30 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
34d40 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
34d50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
34d60 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
34d70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
34d80 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
34d90 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
34da0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
34db0 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  t>=0 || op==SAVE
34dc0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
34dd0 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f  ;..  if( iSavepo
34de0 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  int<pPager->nSav
34df0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e  epoint ){.    in
34e00 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
34e10 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
34e20 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
34e30 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
34e40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d  /* Number of rem
34e50 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  aining savepoint
34e60 73 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e  s after this op.
34e70 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   */..    /* Figu
34e80 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
34e90 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20  savepoints will 
34ea0 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20  still be active 
34eb0 61 66 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a  after this.    *
34ec0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f  * operation. Sto
34ed0 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  re this value in
34ee0 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65   nNew. Then free
34ef0 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63   resources assoc
34f00 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69  iated .    ** wi
34f10 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  th any savepoint
34f20 73 20 74 68 61 74 20 61 72 65 20 64 65 73 74 72  s that are destr
34f30 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  oyed by this ope
34f40 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
34f50 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70     nNew = iSavep
34f60 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41  oint + (( op==SA
34f70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
34f80 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20 20 20  ) ? 0 : 1);.    
34f90 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c  for(ii=nNew; ii<
34fa0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
34fb0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
34fc0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
34fd0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
34fe0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
34ff0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
35000 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  }.    pPager->nS
35010 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b  avepoint = nNew;
35020 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
35030 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
35040 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
35050 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
35060 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
35070 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65  ub-journal to ze
35080 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
35090 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d  . */.    if( op=
350a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
350b0 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  SE ){.      if( 
350c0 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f 70 65  nNew==0 && isOpe
350d0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
350e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
350f0 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66 20 69  ly truncate if i
35100 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t is an in-memor
35110 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  y sub-journal. *
35120 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
35130 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
35140 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  l(pPager->sjfd) 
35150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
35160 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
35170 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
35180 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
35190 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
351a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
351b0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
351c0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
351d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
351e0 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73 20 69    /* Else this i
351f0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
35200 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b  ration, playback
35210 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73   the specified s
35220 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a  avepoint..    **
35230 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 65   If this is a te
35240 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20 70  mp-file, it is p
35250 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65  ossible that the
35260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
35270 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74  s.    ** not yet
35280 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e   been opened. In
35290 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
352a0 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
352b0 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  anges to.    ** 
352c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
352d0 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79 62 61  e, so the playba
352e0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e  ck operation can
352f0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
35300 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
35310 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
35320 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70  ger) || isOpen(p
35330 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
35340 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
35350 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20  int *pSavepoint 
35360 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70  = (nNew==0)?0:&p
35370 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
35380 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20  t[nNew-1];.     
35390 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62   rc = pagerPlayb
353a0 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61  ackSavepoint(pPa
353b0 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29  ger, pSavepoint)
353c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 72  ;.      assert(r
353d0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b  c!=SQLITE_DONE);
353e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20  .    }.  .  }.  
353f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35400 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
35410 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
35420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35430 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
35440 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
35450 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
35460 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35470 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
35480 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
35490 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63  rn the VFS struc
354a0 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67  ture for the pag
354b0 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  er..*/.const sql
354c0 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
354d0 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20  3PagerVfs(Pager 
354e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
354f0 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b  rn pPager->pVfs;
35500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
35510 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
35520 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
35530 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
35540 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61  d.** with the pa
35550 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ger.  This might
35560 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
35570 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20  the file has.** 
35580 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
35590 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
355a0 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67  file *sqlite3Pag
355b0 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50  erFile(Pager *pP
355c0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
355d0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f  pPager->fd;.}../
355e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
355f0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
35600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35610 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
35620 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
35630 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
35640 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
35650 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
35660 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
35670 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
35680 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
35690 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
356a0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
356b0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
356c0 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
356d0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
356e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
356f0 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
35700 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
35710 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
35720 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
35730 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
35740 53 65 74 20 6f 72 20 72 65 74 72 69 65 76 65 20  Set or retrieve 
35750 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
35760 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
35770 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
35780 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
35790 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
357a0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
357b0 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
357c0 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
357d0 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
357e0 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  int,int),.  void
357f0 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
35800 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70  oid*),.  void *p
35810 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70  Codec.){.  if( p
35820 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
35830 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
35840 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
35850 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72  Codec);.  pPager
35860 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67 65  ->xCodec = pPage
35870 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78  r->memDb ? 0 : x
35880 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
35890 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
358a0 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  = xCodecSizeChng
358b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
358c0 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46  ecFree = xCodecF
358d0 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ree;.  pPager->p
358e0 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a  Codec = pCodec;.
358f0 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
35900 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69  e(pPager);.}.voi
35910 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
35920 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70  etCodec(Pager *p
35930 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
35940 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b   pPager->pCodec;
35950 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
35960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35970 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
35980 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
35990 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
359a0 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
359b0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
359c0 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
359d0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
359e0 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
359f0 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
35a00 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
35a10 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
35a20 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
35a30 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
35a40 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
35a50 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
35a60 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
35a70 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
35a80 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
35a90 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
35aa0 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
35ab0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
35ac0 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
35ad0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
35ae0 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
35af0 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
35b00 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
35b10 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
35b20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
35b30 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
35b40 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
35b50 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
35b60 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
35b70 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
35b80 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
35b90 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
35ba0 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
35bb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35bc0 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
35bd0 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
35be0 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
35bf0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
35c00 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
35c10 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
35c20 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
35c30 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
35c40 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
35c50 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
35c60 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
35c70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
35c80 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
35c90 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
35ca0 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
35cb0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
35cc0 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
35cd0 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
35ce0 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
35cf0 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
35d00 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
35d10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
35d20 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
35d30 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
35d40 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
35d50 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
35d60 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
35d70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
35d80 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
35d90 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
35da0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
35db0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
35dc0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
35dd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  n SQLITE_NOMEM o
35de0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
35df0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
35e00 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77  * occurs. Otherw
35e10 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ise, it returns 
35e20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
35e30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
35e40 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
35e50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
35e60 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
35e70 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
35e80 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20  gHdr *pPgOld;   
35e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35ea0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
35eb0 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
35ec0 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
35ed0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
35ee0 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67  Old value of pPg
35ef0 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20  ->pgno, if sync 
35f00 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  is required */. 
35f10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
35f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35f30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35f40 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b    Pgno origPgno;
35f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35f60 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  * The original p
35f70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  age number */.. 
35f80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
35f90 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ef>0 );..  /* In
35fa0 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c   order to be abl
35fb0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  e to rollback, a
35fc0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
35fd0 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61  base must journa
35fe0 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  l.  ** the page 
35ff0 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72  we are moving fr
36000 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  om..  */.  if( M
36010 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d  EMDB ){.    rc =
36020 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
36030 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
36040 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36050 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
36060 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76  e page being mov
36070 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20  ed is dirty and 
36080 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76  has not been sav
36090 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74  ed by the latest
360a0 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c  .  ** savepoint,
360b0 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63   then save the c
360c0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
360d0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  of the page into
360e0 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
360f0 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73  ournal now. This
36100 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
36110 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f  handle the follo
36120 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20  wing scenario:. 
36130 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
36140 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
36150 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e  nal page X, then
36160 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65   modify it in me
36170 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53  mory>.  **     S
36180 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
36190 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70  **       <Move p
361a0 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f  age X to locatio
361b0 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f  n Y>.  **     RO
361c0 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
361d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65   **.  ** If page
361e0 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74   X were not writ
361f0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
36200 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20  ournal here, it 
36210 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  would not.  ** b
36220 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  e possible to re
36230 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e  store its conten
36240 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ts when the "ROL
36250 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20  LBACK TO one".  
36260 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72  ** statement wer
36270 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a  e is processed..
36280 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75    **.  ** subjou
36290 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e  rnalPage() may n
362a0 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  eed to allocate 
362b0 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70  space to store p
362c0 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20  Pg->pgno into.  
362d0 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ** one or more s
362e0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
362f0 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65  . This is the re
36300 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ason this functi
36310 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  on.  ** may retu
36320 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
36330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
36340 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
36350 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  TY.   && subjReq
36360 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
36370 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
36380 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
36390 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
363a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
363b0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
363c0 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
363d0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
363e0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
363f0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
36400 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
36410 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
36420 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
36430 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
36440 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
36450 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
36460 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
36470 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
36480 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
36490 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
364a0 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
364b0 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
364c0 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
364d0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
364e0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
364f0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
36500 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
36510 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
36520 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
36530 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
36540 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
36550 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
36560 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
36570 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
36580 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
36590 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
365a0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
365b0 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
365c0 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
365d0 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
365e0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
365f0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
36600 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
36610 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
36620 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
36630 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
36640 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
36650 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
36660 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
36670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
36680 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
36690 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
366a0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
366b0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
366c0 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
366d0 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
366e0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
366f0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
36700 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
36710 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
36720 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
36730 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
36740 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
36750 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
36760 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
36770 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
36780 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
36790 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
367a0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
367b0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
367c0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
367d0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
367e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
367f0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
36800 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
36810 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
36820 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
36830 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
36840 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
36850 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
36860 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
36870 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
36880 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72  discard pages fr
36890 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
368a0 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77  database since w
368b0 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
368c0 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
368d0 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d  k later.  Just m
368e0 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ove the page out
368f0 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a   of the way. */.
36900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
36910 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
36920 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
36930 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
36940 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  Old, pPager->dbS
36950 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ize+1);.    }els
36960 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
36970 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
36980 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
36990 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d   origPgno = pPg-
369a0 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  >pgno;.  sqlite3
369b0 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
369c0 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  pgno);.  sqlite3
369d0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
369e0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
369f0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
36a00 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
36a10 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
36a20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
36a30 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36a50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
36a60 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
36a70 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
36a80 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
36a90 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
36aa0 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
36ab0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
36ac0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
36ad0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
36ae0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
36af0 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
36b00 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
36b10 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
36b20 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
36b30 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
36b40 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
36b50 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
36b60 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
36b70 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
36b80 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
36b90 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
36ba0 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
36bb0 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
36bc0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
36bd0 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
36be0 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
36bf0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
36c00 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
36c10 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
36c20 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
36c30 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
36c40 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
36c50 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
36c60 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
36c70 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
36c80 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
36c90 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
36ca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
36cb0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
36cc0 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
36cd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
36ce0 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
36cf0 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
36d00 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
36d10 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
36d20 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
36d30 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
36d40 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
36d50 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
36d60 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
36d70 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
36d80 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
36d90 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
36da0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
36db0 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
36dc0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
36dd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36de0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
36df0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36e00 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
36e10 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
36e20 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
36e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36e40 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53  .      if( needS
36e50 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
36e60 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
36e70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
36e80 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
36e90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
36ea0 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
36eb0 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
36ec0 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
36ed0 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  no, pPager->pTmp
36ee0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Space);.      }.
36ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36f00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
36f10 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
36f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36f30 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
36f40 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  & !MEMDB );.    
36f50 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d  pPgHdr->flags |=
36f60 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
36f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
36f80 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36f90 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
36fa0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
36fb0 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dr);.  }..  /*. 
36fc0 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65   ** For an in-me
36fd0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d  mory database, m
36fe0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69  ake sure the ori
36ff0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69  ginal page conti
37000 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69  nues.  ** to exi
37010 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  st, in case the 
37020 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
37030 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  s to roll back. 
37040 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a   Use pPgOld.  **
37050 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
37060 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68   page since it h
37070 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
37080 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a  allocated..  */.
37090 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
370a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
370b0 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69  Move(pPgOld, ori
370c0 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69  gPgno);.    sqli
370d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
370e0 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  gOld);.  }..  re
370f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37100 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
37110 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
37120 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
37130 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
37140 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
37150 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
37160 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
37170 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
37180 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
37190 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
371a0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
371b0 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
371c0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
371d0 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
371e0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
371f0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
37200 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
37210 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
37220 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
37230 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
37240 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
37250 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
37260 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExtra;.}../*.**
37270 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
37280 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
37290 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
372a0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
372b0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
372c0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
372d0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
372e0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
372f0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
37300 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
37310 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
37320 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
37330 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
37340 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
37350 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
37360 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
37370 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
37380 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
37390 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
373a0 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
373b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
373c0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
373d0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
373e0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
373f0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
37400 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
37410 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
37420 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
37430 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
37440 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
37450 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
37460 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
37470 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
37480 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
37490 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
374a0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
374b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
374c0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
374d0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
374e0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
374f0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
37500 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
37510 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
37520 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
37530 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
37540 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
37550 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
37560 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
37570 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
37580 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
37590 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
375a0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
375b0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  de;.}../*.** Set
375c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
375d0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
375e0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
375f0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  e must be one of
37600 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52  :.**.**    PAGER
37610 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
37620 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ETE.**    PAGER_
37630 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
37640 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  CATE.**    PAGER
37650 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
37660 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52  SIST.**    PAGER
37670 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37680 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
37690 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a  RNALMODE_MEMORY.
376a0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
376b0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a  NALMODE_WAL.**.*
376c0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64  * The journalmod
376d0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
376e0 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20  value specified 
376f0 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  if the change is
37700 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 54 68 65   allowed..** The
37710 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 64   change may be d
37720 69 73 61 6c 6c 6f 77 65 64 20 66 6f 72 20 74 68  isallowed for th
37730 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
37740 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
37750 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
37760 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
37770 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
37780 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
37790 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
377a0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
377b0 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  Temporary databa
377c0 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20  ses cannot have 
377d0 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65  _WAL journalmode
377e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
377f0 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
37800 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
37810 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75  bly updated) jou
37820 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
37830 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
37840 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  tJournalMode(Pag
37850 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
37860 65 4d 6f 64 65 29 7b 0a 20 20 75 38 20 65 4f 6c  eMode){.  u8 eOl
37870 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d = pPager->jour
37880 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 2f 2a 20 50  nalMode;    /* P
37890 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65  rior journalmode
378a0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 65 4d   */..  /* The eM
378b0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
378c0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 2a 2f   always valid */
378d0 0a 20 20 61 73 73 65 72 74 28 20 20 20 20 20 20  .  assert(      
378e0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
378f0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
37900 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
37910 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
37920 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
37930 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37940 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37950 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
37960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37970 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37980 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
37990 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
379a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
379b0 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
379c0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
379d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
379e0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20  DE_MEMORY );..  
379f0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
37a00 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20  the journalmode 
37a10 6f 66 20 61 20 54 45 4d 50 20 64 61 74 61 62 61  of a TEMP databa
37a20 73 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  se to be changed
37a30 20 74 6f 20 57 41 4c 0a 20 20 2a 2f 0a 20 20 69   to WAL.  */.  i
37a40 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
37a50 69 6c 65 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41  ile && eMode==PA
37a60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37a70 57 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  WAL ){.    asser
37a80 74 28 20 65 4f 6c 64 21 3d 50 41 47 45 52 5f 4a  t( eOld!=PAGER_J
37a90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
37aa0 3b 0a 20 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f  ;.    eMode = eO
37ab0 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  ld;.  }..  /* Do
37ac0 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e   allow the journ
37ad0 61 6c 6d 6f 64 65 20 6f 66 20 61 6e 20 69 6e 2d  almode of an in-
37ae0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
37af0 74 6f 20 62 65 20 73 65 74 20 74 6f 0a 20 20 2a  to be set to.  *
37b00 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  * anything other
37b10 20 74 68 61 6e 20 4d 45 4d 4f 52 59 20 6f 72 20   than MEMORY or 
37b20 4f 46 46 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  OFF.  */.  if( M
37b30 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
37b40 72 74 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  rt( eOld==PAGER_
37b50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
37b60 52 59 20 7c 7c 20 65 4f 6c 64 3d 3d 50 41 47 45  RY || eOld==PAGE
37b70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
37b80 46 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f  F );.    if( eMo
37b90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37ba0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 26 20  LMODE_MEMORY && 
37bb0 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  eMode!=PAGER_JOU
37bc0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
37bd0 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f        eMode = eO
37be0 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ld;.    }.  }.. 
37bf0 20 69 66 28 20 65 4d 6f 64 65 21 3d 65 4f 6c 64   if( eMode!=eOld
37c00 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20   ){.    /* When 
37c10 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e  changing between
37c20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 73 2c   rollback modes,
37c30 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
37c40 61 6c 20 66 69 6c 65 20 70 72 69 6f 72 0a 20 20  al file prior.  
37c50 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 68 61 6e    ** to the chan
37c60 67 65 2e 20 20 42 75 74 20 77 68 65 6e 20 63 68  ge.  But when ch
37c70 61 6e 67 69 6e 67 20 66 72 6f 6d 20 61 20 72 6f  anging from a ro
37c80 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 6f 20 57  llback mode to W
37c90 41 4c 2c 20 6b 65 65 70 0a 20 20 20 20 2a 2a 20  AL, keep.    ** 
37ca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  the journal open
37cb0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
37cc0 61 20 72 6f 6c 6c 62 61 63 6b 2d 73 74 79 6c 65  a rollback-style
37cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
37ce0 70 6c 61 79 0a 20 20 20 20 2a 2a 20 75 73 65 64  play.    ** used
37cf0 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
37d00 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 20  version numbers 
37d10 69 6e 20 74 68 65 20 62 74 72 65 65 20 68 65 61  in the btree hea
37d20 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
37d30 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
37d40 72 2d 3e 6a 66 64 29 20 26 26 20 65 4d 6f 64 65  r->jfd) && eMode
37d50 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37d60 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
37d70 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
37d80 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
37d90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 61 6e    }..    /* Chan
37da0 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  ge the journal m
37db0 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ode. */.    pPag
37dc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
37dd0 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 0a 20 20  = (u8)eMode;..  
37de0 20 20 2f 2a 20 57 68 65 6e 20 74 72 61 6e 73 69    /* When transi
37df0 73 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 54 52  stioning from TR
37e00 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53  UNCATE or PERSIS
37e10 54 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 6a  T to any other j
37e20 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f  ournal.    ** mo
37e30 64 65 20 65 78 63 65 70 74 20 57 41 4c 20 28 61  de except WAL (a
37e40 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
37e50 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
37e60 43 4c 55 53 49 56 45 29 20 74 68 65 6e 20 0a 20  CLUSIVE) then . 
37e70 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
37e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
37e90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
37ea0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37eb0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
37ec0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
37ed0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
37ee0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
37ef0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
37f00 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37f10 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
37f20 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 5)==0 );.    
37f30 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
37f40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
37f50 59 20 26 20 35 29 3d 3d 34 20 29 3b 0a 20 20 20  Y & 5)==4 );.   
37f60 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37f70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
37f80 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 5)==0 );.    a
37f90 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37fa0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 26 20  URNALMODE_WAL & 
37fb0 35 29 3d 3d 35 20 29 3b 0a 0a 20 20 20 20 61 73  5)==5 );..    as
37fc0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
37fd0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
37fe0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
37ff0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  e );.    if( !pP
38000 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
38010 6f 64 65 20 26 26 20 28 65 4f 6c 64 20 26 20 35  ode && (eOld & 5
38020 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26  )==1 && (eMode &
38030 20 31 29 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 20   1)==0 ){..     
38040 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
38050 20 77 65 20 77 6f 75 6c 64 20 6c 69 6b 65 20 74   we would like t
38060 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
38070 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 69 74  rnal file. If it
38080 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74   is.      ** not
38090 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e 20   possible, then 
380a0 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
380b0 6f 62 6c 65 6d 2e 20 44 65 6c 65 74 69 6e 67 20  oblem. Deleting 
380c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
380d0 0a 20 20 20 20 20 20 2a 2a 20 68 65 72 65 20 69  .      ** here i
380e0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
380f0 6e 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2a  n only..      **
38100 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65  .      ** Before
38110 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
38120 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 62 74 61  urnal file, obta
38130 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
38140 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  ck on the.      
38150 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
38160 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
38170 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
38180 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
38190 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  ted.      ** whi
381a0 6c 65 20 69 74 20 69 73 20 69 6e 20 75 73 65 20  le it is in use 
381b0 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6c  by some other cl
381c0 69 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ient..      */. 
381d0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
381e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
381f0 6e 74 20 73 74 61 74 65 20 3d 20 70 50 61 67 65  nt state = pPage
38200 72 2d 3e 73 74 61 74 65 3b 0a 20 20 20 20 20 20  r->state;.      
38210 69 66 28 20 73 74 61 74 65 3c 50 41 47 45 52 5f  if( state<PAGER_
38220 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20  SHARED ){.      
38230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
38240 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
38250 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
38260 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
38270 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
38280 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ARED ){.        
38290 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
382a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
382b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
382c0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
382d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
382e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
382f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38300 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
38310 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
38320 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
38330 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
38340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
38350 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
38360 26 20 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  & state==PAGER_S
38370 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
38380 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
38390 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
383a0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
383b0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 61 74 65   }else if( state
383c0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
383d0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
383e0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
383f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
38400 73 65 72 74 28 20 73 74 61 74 65 3d 3d 70 50 61  sert( state==pPa
38410 67 65 72 2d 3e 73 74 61 74 65 20 29 3b 0a 20 20  ger->state );.  
38420 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
38430 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6a 6f 75  turn the new jou
38440 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 72  rnal mode */.  r
38450 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
38460 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
38470 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
38480 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
38490 6e 61 6c 20 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal mode..*/.int
384a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
384b0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
384c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
384d0 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
384e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
384f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
38500 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 72  RUE if the pager
38510 20 69 73 20 69 6e 20 61 20 73 74 61 74 65 20 77   is in a state w
38520 68 65 72 65 20 69 74 20 69 73 20 4f 4b 20 74 6f  here it is OK to
38530 20 63 68 61 6e 67 65 20 74 68 65 0a 2a 2a 20 6a   change the.** j
38540 6f 75 72 6e 61 6c 6d 6f 64 65 2e 20 20 4a 6f 75  ournalmode.  Jou
38550 72 6e 61 6c 6d 6f 64 65 20 63 68 61 6e 67 65 73  rnalmode changes
38560 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
38570 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
38580 73 65 0a 2a 2a 20 69 73 20 75 6e 6d 6f 64 69 66  se.** is unmodif
38590 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
385a0 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e  te3PagerOkToChan
385b0 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  geJournalMode(Pa
385c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
385d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
385e0 64 69 66 69 65 64 20 29 20 72 65 74 75 72 6e 20  dified ) return 
385f0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69  0;.  if( NEVER(i
38600 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
38610 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
38620 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 20 72 65  urnalOff>0) ) re
38630 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
38640 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   1;.}../*.** Get
38650 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
38660 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
38670 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
38680 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74  files..**.** Set
38690 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69  ting the size li
386a0 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20  mit to -1 means 
386b0 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f  no limit is enfo
386c0 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65  rced..** An atte
386d0 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d  mpt to set a lim
386e0 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  it smaller than 
386f0 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  -1 is a no-op..*
38700 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
38710 65 72 4a 6f 75 72 6e 61