/ Hex Artifact Content
Login

Artifact 19975354882e9ac8d361bb3c1c434fd3aa9b0928:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
3a50: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
3a60: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
3a70: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a90: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3aa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3ab0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3ac0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3ae0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3af0: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3b30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3b40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3b70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3b80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3b90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ba0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3bb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3bc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3bd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
3be0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3bf0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3c00: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3c10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3c20: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c40: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3c60: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3c80: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3c90: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
3ca0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
3cb0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
3cc0: 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  those class memb
3cd0: 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e  ers that are dyn
3ce0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f  amically.  ** mo
3cf0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f  dified during no
3d00: 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rmal operations.
3d10: 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61   The other varia
3d20: 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72  bles in this str
3d30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20  ucture.  ** are 
3d40: 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20  either constant 
3d50: 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c  throughout the l
3d60: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70  ifetime of the p
3d70: 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20  ager, or else.  
3d80: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
3d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
3da0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
3db0: 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68  ffect the way th
3dc0: 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70  e pager .  ** op
3dd0: 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  erates..  **.  *
3de0: 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61  * The 'state' va
3df0: 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69  riable is descri
3e00: 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61  bed in more deta
3e10: 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  il along with th
3e20: 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69  e.  ** descripti
3e30: 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ons of the value
3e40: 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20  s it may take - 
3e50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63  PAGER_UNLOCK etc
3e60: 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20  . Many of the.  
3e70: 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  ** other variabl
3e80: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
3e90: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69   are described i
3ea0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69  n the comment di
3eb0: 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f  rectly .  ** abo
3ec0: 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65  ve this class de
3ed0: 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  finition..  */. 
3ee0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
3f10: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
3f20: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64  , etc. */.  u8 d
3f30: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f50: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
3f60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3f70: 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  Db */.  u8 needS
3f80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3fa0: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3fb0: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3fc0: 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  al */.  u8 journ
3fd0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3ff0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
4000: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
4010: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4020: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4030: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4040: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4050: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
4060: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4080: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
4090: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
40a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
40b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
40d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
40e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
40f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
4100: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
4110: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
4120: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
4130: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
4140: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
4150: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4160: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
4170: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
4180: 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d  /.  u8 subjInMem
4190: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
41a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69  /* True to use i
41b0: 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
41c0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  rnals */.  Pgno 
41d0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4200: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
4210: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4230: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4240: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4250: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
4260: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
42a0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
42d0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
4310: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
4320: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
4330: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
4340: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
4350: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
4360: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
4370: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
4380: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
43b0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
43c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
43e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
43f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4420: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4430: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4440: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
4460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4470: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
4480: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4490: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
44a0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
44b0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
44c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
44d0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
44e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
44f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
4500: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4510: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
4520: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
4530: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
4540: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
4550: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4560: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4570: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4580: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4590: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
45a0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
45b0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
45c0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50  nal files */.  P
45d0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
45e0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
45f0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
4600: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
4610: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4630: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4640: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
4650: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4660: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4670: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4680: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4690: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
46a0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46c0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
46d0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
46e0: 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ck */..  u16 nEx
46f0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4710: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4720: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4730: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
4740: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
4750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4760: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
4770: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
4780: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
4790: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
47a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
47b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
47c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  n() */.  int pag
47d0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
47e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47f0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4800: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
4810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
4820: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
4830: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
4840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4850: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4880: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
4890: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
48a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
48b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
48c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
48d0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
48e0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
48f0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
4900: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
4910: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
4920: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4930: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
4940: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69  usyHandler */.#i
4950: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4960: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4970: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4980: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4990: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
49a0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49c0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49d0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49e0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
49f0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4a20: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4a40: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
4a50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
4a60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
4a70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
4a80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
4a90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
4aa0: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
4ab0: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
4ac0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
4ad0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
4ae0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
4af0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
4b00: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
4b10: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
4b20: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
4b30: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
4b40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b50: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
4b60: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
4b70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4b80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4b90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4ba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4bb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4bc0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
4bd0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
4be0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
4bf0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
4c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
4c10: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
4c30: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
4c40: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
4c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
4c70: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4c90: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
4ca0: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
4cb0: 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69 66  e=wal" */.#endif
4cc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4cd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4ce0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4cf0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4d00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4d10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4d20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4d30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4d40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4d50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4d60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4d70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4d90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4da0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4db0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4dc0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4dd0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4de0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4df0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4e00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4e10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4e20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4e30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4e40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4e50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4e60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4e70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
4e80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4e90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4ea0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4eb0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4ec0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
4ed0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
4ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
4ef0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
4f00: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
4f10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
4f20: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
4f30: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
4f40: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
4f50: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
4f60: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
4f70: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
4f80: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
4f90: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
4fa0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
4fb0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
4fc0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
4fd0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
4fe0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
4ff0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
5000: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
5010: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
5020: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
5030: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
5040: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
5050: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
5060: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
5070: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
5080: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
5090: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
50a0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
50b0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
50c0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
50d0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
50e0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
50f0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
5100: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
5110: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
5120: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
5130: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
5140: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
5150: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
5160: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
5170: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
5180: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
5190: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
51a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
51b0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
51c0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
51d0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
51e0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
51f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5200: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
5210: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
5220: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
5230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
5240: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
5250: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
5260: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
5270: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
5280: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
5290: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
52a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
52b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
52c0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
52d0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
52e0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
52f0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
5300: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
5310: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
5320: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
5330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
5340: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
5350: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
5360: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
5370: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
5380: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
5390: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
53a0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
53b0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
53c0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
53d0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
53e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
53f0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
5400: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
5410: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
5420: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
5430: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
5440: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
5450: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
5460: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
5470: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
5480: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
5490: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
54a0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
54b0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
54c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
54d0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
54e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
54f0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
5500: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
5510: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
5520: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
5530: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
5540: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
5550: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
5560: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5570: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5580: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5590: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
55a0: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
55b0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
55c0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
55d0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
55e0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
55f0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
5600: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
5610: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
5620: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
5630: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
5640: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
5650: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5660: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5670: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5680: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5690: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
56a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
56b0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
56c0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
56d0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
56e0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
56f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5700: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
5710: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
5720: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
5730: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
5740: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
5750: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
5760: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
5770: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
5780: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
5790: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
57a0: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
57b0: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
57c0: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
57d0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
57e0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
57f0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
5800: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
5810: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
5820: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
5830: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
5840: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
5850: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
5860: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
5870: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
5880: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
5890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
58a0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
58b0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
58c0: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
58d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
58e0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
58f0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
5900: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
5910: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
5920: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
5930: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
5940: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5950: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
5960: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
5970: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
5980: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
5990: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
59a0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
59b0: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
59c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
59d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
59e0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
59f0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
5a00: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
5a10: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
5a20: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
5a30: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
5a40: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
5a50: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
5a60: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
5a70: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
5a80: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
5a90: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
5aa0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5ab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5ac0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
5ad0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
5ae0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
5af0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
5b00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
5b10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
5b20: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
5b30: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
5b40: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
5b50: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
5b60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
5b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5b90: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
5ba0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
5bb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5bd0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
5be0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
5bf0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
5c00: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
5c10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
5c20: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
5c30: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
5c40: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
5c50: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5c60: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
5c70: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
5c80: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
5c90: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
5ca0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
5cb0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
5cc0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
5cd0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
5ce0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
5cf0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
5d00: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
5d10: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
5d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
5d30: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
5d40: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
5d50: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
5d60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5d70: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
5d80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
5d90: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
5da0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
5db0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5dc0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5dd0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5de0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5df0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5e00: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5e10: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5e20: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5e30: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5e40: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5e50: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5e60: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5e70: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5e80: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5e90: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5ea0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5eb0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5ec0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5ed0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5ee0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5ef0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5f00: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5f10: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
5f20: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
5f30: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
5f40: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
5f50: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
5f60: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
5f70: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
5f80: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
5f90: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
5fa0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
5fb0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
5fc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
5fd0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
5fe0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
5ff0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
6000: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
6010: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
6020: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
6030: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
6040: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
6050: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
6060: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
6070: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
6080: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
6090: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
60a0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
60b0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
60c0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
60d0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
60e0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
60f0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
6100: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
6110: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
6120: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
6130: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
6140: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
6150: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
6160: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
6170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
6190: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
61a0: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
61b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
61c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
61d0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
61e0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
61f0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
6200: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
6210: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
6220: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
6230: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
6240: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
6250: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
6260: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
6270: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
6280: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
6290: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
62a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
62b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
62c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
62d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
62e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
62f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
6300: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
6310: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
6320: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
6330: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
6340: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
6350: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
6360: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
6370: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
6380: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
6390: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
63a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
63b0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
63c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
63d0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
63e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
63f0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
6400: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
6410: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
6420: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
6430: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
6440: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
6450: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
6460: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
6470: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
6480: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
6490: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
64a0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
64b0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
64c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
64d0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
64e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
64f0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
6520: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
6530: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
6540: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
6550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
6560: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
6570: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
65a0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
65b0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
65c0: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
65d0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
65e0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
65f0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
6600: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
6610: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
6620: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
6630: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
6640: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
6650: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
6660: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
6670: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
6680: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
6690: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
66a0: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
66b0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
66c0: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
66d0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
66e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
66f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
6700: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
6710: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
6720: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
6730: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
6740: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
6750: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
6760: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
6770: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
6780: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
6790: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
67a0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
67b0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
67c0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
67d0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
67e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
67f0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
6800: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
6810: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
6820: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
6830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
6840: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
6850: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
6860: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
6870: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
6880: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6890: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
68a0: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
68b0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
68c0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
68d0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
68e0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
68f0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
6900: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
6910: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
6920: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
6930: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
6940: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
6950: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
6960: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
6970: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
6980: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
6990: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
69a0: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
69c0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
69d0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
69e0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
69f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6a00: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
6a10: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
6a20: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
6a30: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
6a40: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
6a50: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
6a60: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
6a70: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
6a80: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
6a90: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
6aa0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
6ab0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
6ac0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
6ad0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
6ae0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6af0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
6b00: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
6b10: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
6b20: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
6b30: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
6b40: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
6b50: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
6b60: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
6b70: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
6b80: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
6b90: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
6ba0: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
6bb0: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
6bc0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6bd0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
6be0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
6bf0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
6c00: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
6c10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6c20: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
6c30: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
6c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
6c50: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
6c60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6c70: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
6c80: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
6c90: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
6ca0: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
6cb0: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
6cc0: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
6cd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
6ce0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6cf0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
6d00: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
6d10: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
6d20: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
6d30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6d40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
6d50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
6d60: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
6d70: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
6d80: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
6d90: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
6da0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
6db0: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
6dc0: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
6dd0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
6de0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
6df0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
6e00: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
6e10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e20: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
6e30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
6e40: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
6e50: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
6e60: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
6e70: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
6e80: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
6e90: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
6ea0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
6eb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ec0: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
6ed0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
6ee0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
6ef0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6f00: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
6f10: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
6f20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
6f30: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
6f40: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
6f50: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
6f60: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
6f70: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
6f80: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
6f90: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
6fa0: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
6fb0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
6fc0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
6fd0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
6fe0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
6ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7000: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
7010: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
7020: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
7030: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
7040: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
7050: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7060: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
7070: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
7080: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
7090: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
70a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
70b0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
70c0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
70d0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
70e0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
70f0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
7100: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7120: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
7130: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
7140: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
7150: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
7160: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7170: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
71a0: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
71b0: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
71c0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71e0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
71f0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
7200: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7220: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
7230: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
7240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
7250: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
7260: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
7270: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
7280: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
7290: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
72a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
72b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
72c0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
72d0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
72e0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
72f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
7300: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
7310: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
7320: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
7330: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
7340: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
7350: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
7360: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
7370: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
7380: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
7390: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
73a0: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
73b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
73c0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
73d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
73e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
73f0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
7400: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
7410: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
7420: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
7430: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
7440: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
7450: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
7470: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
7480: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
7490: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
74a0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
74b0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
74c0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
74d0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
74e0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
74f0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
7500: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
7510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7520: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
7530: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
7540: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
7550: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
7560: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
7570: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
7580: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
7590: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
75a0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
75b0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
75c0: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
75d0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
75e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
75f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7600: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
7610: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
7620: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
7630: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
7640: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
7650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7660: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
7670: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
7680: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7690: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
76a0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
76b0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
76c0: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
76d0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
76e0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
76f0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
7720: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
7730: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
7740: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
7750: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
7760: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
7780: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
77b0: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
77c0: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
77d0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
77e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
77f0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
7800: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
7810: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
7820: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
7830: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
7840: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
7850: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
7860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7870: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
7880: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
7890: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
78a0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
78b0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
78c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
78d0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
78e0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
78f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
7900: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
7910: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
7920: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7930: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7940: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
7950: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
7960: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
7970: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
7980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
7990: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
79a0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
79b0: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
79c0: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
79d0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
79e0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
79f0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
7a00: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
7a10: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
7a20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
7a30: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
7a40: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
7a50: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
7a60: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
7a70: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
7a80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
7a90: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
7aa0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
7ab0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
7ac0: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
7ad0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
7ae0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
7af0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
7b00: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
7b10: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
7b20: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
7b30: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
7b40: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
7b50: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
7b60: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
7b70: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
7b80: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
7b90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
7ba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
7bb0: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
7bc0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
7bd0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
7be0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
7bf0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
7c00: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
7c10: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
7c20: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
7c30: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
7c40: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
7c50: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
7c60: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
7c70: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
7c80: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
7c90: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
7ca0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
7cb0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
7cc0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
7cd0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
7ce0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
7cf0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
7d00: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
7d10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d40: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7d50: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7d60: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
7d70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
7d80: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
7d90: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
7da0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7db0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
7dc0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
7dd0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
7de0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
7df0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
7e00: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
7e10: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
7e20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
7e30: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
7e40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
7e50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e60: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7e70: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
7e80: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
7e90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7ea0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7eb0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
7ec0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
7ed0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
7ee0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
7ef0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
7f00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7f10: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
7f20: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
7f30: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
7f40: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
7f50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
7f60: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
7f70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
7f80: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
7f90: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
7fa0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
7fb0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
7fc0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
7fd0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
7fe0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
7ff0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
8000: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
8010: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
8020: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
8030: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
8040: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
8050: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
8060: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
8070: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
8080: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
8090: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
80a0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
80b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
80c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
80d0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
80e0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
80f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
8100: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
8110: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
8120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8130: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
8140: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
8150: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8160: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
8170: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
8180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8190: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
81a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
81b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
81c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
81d0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
81e0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
81f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
8200: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
8210: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
8220: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
8230: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
8240: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
8250: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
8260: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
8270: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
8280: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
8290: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
82a0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
82b0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
82c0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
82d0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
82e0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
82f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
8300: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
8310: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
8320: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
8330: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
8340: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
8350: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
8360: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
8370: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
8380: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
8390: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
83a0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
83b0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
83c0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
83d0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
83e0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
83f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8400: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
8410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8420: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8430: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
8440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8450: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
8460: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
8470: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
8480: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
8490: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
84a0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
84b0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
84c0: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
84d0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
84e0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
84f0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
8500: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
8530: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
8540: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8570: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8580: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
8590: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
85a0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
85b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
85c0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
85d0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
85e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
85f0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
8600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8610: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
8620: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
8630: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
8640: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
8650: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
8660: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
8670: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
8680: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
8690: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
86a0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
86b0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
86c0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
86d0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
86e0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
86f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
8700: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8710: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
8720: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
8730: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
8740: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
8750: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8760: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
8770: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
8780: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
8790: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
87a0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
87b0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
87c0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
87d0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
87e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
87f0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
8800: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
8810: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
8820: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
8830: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
8840: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
8850: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
8860: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
8870: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
8880: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
8890: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
88a0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
88b0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
88c0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
88d0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
88e0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
88f0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
8900: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
8910: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
8920: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
8930: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
8940: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
8950: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
8960: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
8970: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
8980: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
8990: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
89a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
89b0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
89c0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
89d0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
89e0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
89f0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
8a00: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
8a10: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
8a20: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
8a30: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
8a40: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
8a50: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
8a60: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
8a70: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
8a80: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
8a90: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
8aa0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
8ab0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
8ac0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
8ad0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
8ae0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
8af0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
8b00: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
8b10: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
8b20: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
8b30: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
8b40: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
8b50: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
8b60: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
8b70: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
8b80: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
8b90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
8ba0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
8bb0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
8bc0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
8bd0: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  c );.  if( (pPag
8be0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
8bf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
8c00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8c10: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
8c20: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
8c30: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
8c40: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
8c50: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
8c60: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
8c70: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
8c80: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
8c90: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
8ca0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
8cb0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8cc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8cd0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
8ce0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
8cf0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61  .    memset(zHea
8d00: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  der, 0, sizeof(a
8d10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29  JournalMagic)+4)
8d20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
8d30: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
8d40: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
8d50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
8d60: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
8d70: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
8d80: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8d90: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
8da0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
8db0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8dc0: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
8dd0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
8de0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
8df0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
8e00: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
8e10: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
8e20: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
8e30: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
8e40: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
8e50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
8e60: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
8e70: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8e80: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8e90: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
8ea0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
8eb0: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
8ec0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
8ed0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8ee0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8ef0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
8f00: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
8f10: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
8f20: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
8f30: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
8f40: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
8f50: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
8f60: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
8f70: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
8f80: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
8f90: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
8fa0: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
8fb0: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
8fc0: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
8fd0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
8fe0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
8ff0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
9000: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
9010: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
9020: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9030: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
9040: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
9050: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9060: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
9070: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
9080: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
9090: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
90a0: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
90b0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
90c0: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
90d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
90e0: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
90f0: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
9100: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9110: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
9120: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
9130: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
9140: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
9150: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
9160: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
9170: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
9180: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
9190: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
91a0: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
91b0: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
91c0: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
91d0: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
91e0: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
91f0: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
9200: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
9210: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
9220: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
9230: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
9240: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
9250: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
9260: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
9270: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
9280: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
9290: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
92a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
92b0: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
92c0: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
92d0: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
92e0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
92f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
9300: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
9310: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
9320: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
9330: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
9340: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
9350: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
9360: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
9370: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
9380: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
9390: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
93a0: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
93b0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
93c0: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
93d0: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
93e0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
93f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
9400: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
9410: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
9420: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
9430: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9440: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
9450: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
9460: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
9470: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
9480: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
9490: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
94a0: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
94b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
94c0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
94d0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
94e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
94f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9500: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
9510: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9520: 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ff );.    pPager
9530: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9540: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
9550: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9560: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
9570: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
9580: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
9590: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
95a0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
95b0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
95c0: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
95d0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
95e0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
95f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
9600: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
9610: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9620: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
9630: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
9640: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
9650: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
9660: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
9670: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
9680: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
9690: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
96a0: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
96b0: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
96c0: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
96d0: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
96e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
96f0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
9700: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
9710: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
9720: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
9730: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
9740: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9750: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
9760: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
9770: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
9780: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
9790: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
97a0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
97b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
97c0: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
97d0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
97e0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
97f0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
9800: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
9810: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
9820: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
9830: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
9840: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
9850: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
9860: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
9870: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
9880: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
9890: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
98a0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
98b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
98c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
98d0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
98e0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
98f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
9900: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
9910: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c   */.  int isHot,
9920: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
9930: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
9940: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
9950: 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
9960: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
9970: 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20  32 *pNRec,      
9980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9990: 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
99a0: 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65  rom the nRec fie
99b0: 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62  ld */.  u32 *pDb
99c0: 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
99d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
99e0: 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64  ue of original d
99f0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65  atabase size fie
9a00: 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ld */.){.  int r
9a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9a20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9a30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69  n code */.  unsi
9a40: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
9a50: 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75  [8];     /* A bu
9a60: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
9a70: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
9a80: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75  /* Offset of jou
9ab0: 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e  rnal header bein
9ac0: 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  g read */..  ass
9ad0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
9ae0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
9af0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
9b00: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
9b10: 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  /..  /* Advance 
9b20: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
9b30: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
9b40: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
9b50: 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  . If the.  ** jo
9b60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f  urnal file is to
9b70: 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72  o small for ther
9b80: 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72  e to be a header
9b90: 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a   stored at this.
9ba0: 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75    ** point, retu
9bb0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
9bc0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
9bd0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
9be0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
9bf0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
9c00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
9c10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9c20: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
9c30: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9c40: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9c50: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
9c60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9c70: 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  f;..  /* Read in
9c80: 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74   the first 8 byt
9c90: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
9ca0: 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65  l header. If the
9cb0: 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20  y do not match. 
9cc0: 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73   ** the  magic s
9cd0: 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74  tring found at t
9ce0: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
9cf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
9d00: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
9d10: 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20  ITE_DONE. If an 
9d20: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
9d30: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
9d40: 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
9d50: 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  ,.  ** proceed..
9d60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74    */.  if( isHot
9d70: 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61   || iHdrOff!=pPa
9d80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9d90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9da0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
9db0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
9dc0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69  izeof(aMagic), i
9dd0: 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28  HdrOff);.    if(
9de0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
9df0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
9e00: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
9e10: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
9e20: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
9e30: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  c))!=0 ){.      
9e40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9e50: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
9e60: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72   /* Read the fir
9e70: 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20  st three 32-bit 
9e80: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f  fields of the jo
9e90: 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68  urnal header: Th
9ea0: 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c  e nRec.  ** fiel
9eb0: 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d  d, the checksum-
9ec0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20  initializer and 
9ed0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
9ee0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20  e at the start. 
9ef0: 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73   ** of the trans
9f00: 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61  action. Return a
9f10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
9f20: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
9f30: 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ong..  */.  if( 
9f40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
9f50: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
9f60: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9f70: 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c  +8, pNRec)).   |
9f80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9f90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9fa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9fb0: 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e  ff+12, &pPager->
9fc0: 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c  cksumInit)).   |
9fd0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9fe0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9ff0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a000: 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29  ff+16, pDbSize))
a010: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
a020: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
a030: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a040: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ff==0 ){.    u32
a050: 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20   iPageSize;     
a060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
a070: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
a080: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
a090: 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f  /.    u32 iSecto
a0a0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
a0b0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a     /* Sector-siz
a0c0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
a0d0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
a0e0: 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31 36   u16 iPageSize16
a0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a100: 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53 69   Copy of iPageSi
a110: 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61 72  ze in 16-bit var
a120: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  iable */..    /*
a130: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
a140: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
a150: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
a160: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
a170: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
a180: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
a190: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
a1a0: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
a1b0: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
a1c0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
a1d0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a1e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a1f0: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
a200: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
a210: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a220: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
a230: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
a240: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
a250: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
a260: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
a270: 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
a280: 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
a290: 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
a2a0: 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
a2b0: 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
a2c0: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
a2d0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
a2e0: 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
a2f0: 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
a300: 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
a310: 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
a320: 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
a330: 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
a340: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
a350: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
a360: 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
a370: 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
a380: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
a390: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
a3a0: 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
a3b0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
a3c0: 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
a3d0: 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
a3e0: 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
a3f0: 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
a400: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
a410: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
a420: 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
a430: 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
a440: 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
a450: 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
a460: 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
a470: 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
a480: 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
a490: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
a4a0: 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
a4b0: 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
a4c0: 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
a4d0: 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
a4e0: 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
a4f0: 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
a500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
a510: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a530: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
a540: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
a550: 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
a560: 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
a570: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a580: 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
a590: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
a5a0: 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
a5b0: 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
a5c0: 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
a5d0: 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
a5e0: 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
a5f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65      */.    iPage
a600: 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50  Size16 = (u16)iP
a610: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
a620: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
a630: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
a640: 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c 20  , &iPageSize16, 
a650: 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
a660: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
a670: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a680: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a690: 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75   iPageSize16==(u
a6a0: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
a6b0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
a6c0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a6d0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a6e0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a6f0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
a700: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
a710: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
a720: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
a730: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
a740: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
a750: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
a760: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
a770: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
a780: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
a790: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
a7a0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
a7b0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
a7c0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
a7d0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
a7e0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
a7f0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
a800: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
a810: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
a820: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
a830: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
a840: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
a850: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a860: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a870: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
a880: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
a890: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a8a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
a8b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
a8c0: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
a8d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
a8e0: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
a8f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
a900: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
a910: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
a920: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
a930: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
a940: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
a950: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
a960: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
a970: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
a980: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
a990: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
a9a0: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
a9b0: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
a9c0: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
a9d0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
a9e0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
a9f0: 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
aa00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
aa10: 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
aa20: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
aa30: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
aa40: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
aa50: 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
aa60: 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
aa70: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
aa90: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
aaa0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
aab0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
aac0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
aad0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
aae0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
aaf0: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
ab00: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
ab10: 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
ab20: 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
ab30: 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
ab40: 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
ab50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
ab60: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
ab70: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
ab80: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
ab90: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
aba0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
abb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
abc0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
abd0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
abe0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
abf0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ac00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ac30: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
ac40: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
ac50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ac60: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
ac70: 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
ac80: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
ac90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
aca0: 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
acb0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
acc0: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
acd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ace0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
acf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
ad00: 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
ad10: 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
ad20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
ad30: 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
ad40: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69   zMaster */..  i
ad50: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
ad60: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
ad70: 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
ad80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ad90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ada0: 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67  MORY .   || pPag
adb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
adc0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
add0: 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20  DE_OFF .  ){.   
ade0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
adf0: 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
ae00: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
ae10: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
ae20: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
ae30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae40: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
ae50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ae60: 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
ae70: 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
ae80: 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
ae90: 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
aea0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
aeb0: 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
aec0: 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
aed0: 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
aee0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
aef0: 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
af00: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
af10: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
af20: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
af30: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
af40: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
af50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
af60: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
af70: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
af80: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
af90: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
afa0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
afb0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
afc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
afd0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
afe0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
aff0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
b000: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
b010: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
b020: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b030: 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
b040: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b050: 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
b060: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b070: 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
b080: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b090: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
b0a0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
b0b0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
b0c0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
b0d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b0e0: 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
b0f0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
b100: 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
b110: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b120: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b130: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
b140: 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
b150: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b160: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b170: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b180: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
b190: 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
b1a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
b1b0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
b1c0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
b1d0: 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
b1e0: 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
b1f0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
b200: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
b210: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
b220: 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
b230: 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
b240: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b250: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
b260: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
b270: 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67  ster+20);.  pPag
b280: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
b290: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
b2a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
b2b0: 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
b2c0: 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
b2d0: 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
b2e0: 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
b2f0: 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
b300: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b310: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
b320: 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
b330: 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
b340: 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
b350: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
b360: 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
b370: 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
b380: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
b390: 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
b3a0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
b3b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
b3c0: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
b3d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
b3e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
b3f0: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
b400: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
b410: 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
b420: 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
b430: 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
b440: 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
b450: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
b460: 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
b470: 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
b480: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
b490: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
b4a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b4b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
b4c0: 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
b4d0: 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
b4e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
b4f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b500: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
b510: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
b520: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
b530: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b540: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
b550: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
b560: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
b570: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
b580: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
b590: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
b5a0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
b5b0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
b5c0: 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
b5d0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
b5e0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b5f0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b600: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b610: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b640: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
b650: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
b660: 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
b670: 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
b680: 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
b690: 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
b6a0: 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
b6b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
b6c0: 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
b6d0: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
b6e0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
b6f0: 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
b700: 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
b710: 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
b720: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
b730: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
b740: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b750: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
b760: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66  memory pages. If
b770: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 73  .** the pager is
b780: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b790: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
b7a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b7b0: 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20  * TODO: Why can 
b7c0: 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65  we not reset the
b7d0: 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20   pager while in 
b7e0: 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a  error state?.*/.
b7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b800: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
b810: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51  Pager){.  if( SQ
b820: 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d  LITE_OK==pPager-
b830: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b840: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
b850: 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
b860: 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ckup);.    sqlit
b870: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
b880: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
b890: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
b8a0: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
b8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b8c0: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
b8d0: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
b8e0: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
b8f0: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
b900: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
b910: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
b920: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
b930: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
b940: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
b950: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
b960: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
b970: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
b980: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
b990: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
b9a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b9b0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
b9c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
b9d0: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
b9e0: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
b9f0: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
ba00: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ba10: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ba20: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ba30: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
ba40: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ba50: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
ba60: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
ba70: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
ba80: 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
ba90: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
baa0: 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
bab0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
bac0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
bad0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
bae0: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
baf0: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
bb00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
bb10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
bb20: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
bb30: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
bb40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
bb50: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
bb60: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
bb70: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
bb80: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
bb90: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
bba0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
bbb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
bbc0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
bbd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
bbe0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
bbf0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
bc00: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
bc10: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
bc20: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
bc30: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
bc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bc60: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
bc70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
bc80: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bc90: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
bca0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
bcb0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
bcc0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
bcd0: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
bce0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
bcf0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
bd00: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
bd10: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
bd20: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
bd30: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
bd40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bd60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bd80: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
bd90: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
bda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bdb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
bdc0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
bdd0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
bde0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
bdf0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
be00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
be10: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
be20: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
be30: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
be40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
be50: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
be60: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
be70: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
be80: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
be90: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
bea0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
beb0: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
bec0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
bed0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
bee0: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
bef0: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
bf00: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
bf10: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
bf20: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
bf30: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
bf40: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
bf50: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bf60: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
bf70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
bf80: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
bf90: 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73  .** is in exclus
bfa0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ive mode..**.** 
bfb0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bfc0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
bfd0: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
bfe0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
bff0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
c000: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
c010: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
c020: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
c030: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
c040: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
c050: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
c060: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
c070: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
c080: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
c090: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
c0a0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
c0b0: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
c0c0: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
c0d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
c0e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
c0f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c100: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
c110: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
c120: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c130: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
c140: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c160: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
c170: 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
c180: 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
c190: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
c1a0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
c1b0: 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
c1c0: 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
c1d0: 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
c1e0: 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
c1f0: 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
c200: 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
c210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c220: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
c230: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
c240: 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
c250: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
c260: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
c270: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
c280: 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
c290: 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
c2a0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
c2b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
c2c0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c2d0: 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
c2e0: 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
c2f0: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
c300: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
c310: 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
c320: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
c330: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
c340: 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
c350: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
c360: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
c370: 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
c380: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
c390: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
c3a0: 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
c3b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
c3c0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
c3d0: 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
c3e0: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
c3f0: 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
c400: 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
c410: 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
c420: 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
c430: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
c440: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
c450: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c460: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
c470: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ..    sqlite3Bit
c480: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
c490: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
c4a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
c4b0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
c4c0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
c4d0: 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20  ints(pPager);.. 
c4e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
c4f0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73  e is unlocked, s
c500: 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67  omebody else mig
c510: 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68  ht change it. Th
c520: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
c530: 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
c540: 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68  dbSize etc. migh
c550: 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64  t become invalid
c560: 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   if.    ** this 
c570: 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61  happens.  One ca
c580: 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68 69  n argue that thi
c590: 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74  s doesn't need t
c5a0: 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20  o be cleared.   
c5b0: 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68   ** until the ch
c5c0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65  ange-counter che
c5d0: 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65  ck fails in Page
c5e0: 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20  rSharedLock().. 
c5f0: 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74     ** Clearing t
c600: 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 63  he page size cac
c610: 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e 67  he here is being
c620: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20   conservative.. 
c630: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
c640: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
c650: 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  0;..    if( page
c660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
c670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c680: 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
c690: 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
c6a0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
c6b0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c        rc = osUnl
c6c0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c6d0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  NO_LOCK);.    }.
c6e0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c6f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
c700: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  ode = rc;.    }.
c710: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c720: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
c730: 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er))..    /* If 
c740: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
c750: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
c760: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
c770: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
c780: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
c790: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
c7a0: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
c7b0: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
c7c0: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
c7d0: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
c7e0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
c7f0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
c800: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
c810: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c820: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
c830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c840: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
c850: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
c860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c870: 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f    }.      pager_
c880: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
c890: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
c8a0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
c8b0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
c8c0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
c8d0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61  _UNLOCK;.    pPa
c8e0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
c8f0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c900: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c910: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
c920: 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20   when an IOERR, 
c930: 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20  CORRUPT or FULL 
c940: 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76  error.** may hav
c950: 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20  e occurred. The 
c960: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
c970: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
c980: 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72  he pager .** str
c990: 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
c9a0: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
c9b0: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
c9c0: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
c9d0: 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69  r .** API functi
c9e0: 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
c9f0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
ca00: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
ca10: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74  rgument .** to t
ca20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
ca30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
ca40: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
ca50: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
ca60: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
ca70: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
ca80: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
ca90: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
caa0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
cab0: 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  t error is clear
cac0: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
cad0: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
cae0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
caf0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
cb00: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
cb10: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
cb20: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
cb30: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
cb40: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
cb50: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
cb60: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
cb70: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
cb80: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
cb90: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
cba0: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
cbb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
cbc0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
cbd0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
cbe0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
cbf0: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
cc00: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
cc10: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
cc20: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
cc30: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
cc40: 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
cc50: 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
cc60: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
cc70: 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
cc80: 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
cc90: 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
cca0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
ccb0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
ccc0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
ccd0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
cce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
ccf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
cd00: 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
cd10: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
cd20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
cd30: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
cd40: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
cd50: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
cd60: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
cd70: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
cd80: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
cd90: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
cda0: 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
cdb0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
cdc0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
cdd0: 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  de = rc;.  }.  r
cde0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cdf0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
ce00: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
ce10: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
ce20: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
ce30: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
ce40: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
ce50: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
ce60: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
ce70: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
ce80: 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
ce90: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
cea0: 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
ceb0: 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
cec0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
ced0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
cee0: 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
cef0: 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
cf00: 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
cf10: 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
cf20: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65  ase file and cle
cf30: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
cf40: 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  te. If this mean
cf50: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20  s that.** there 
cf60: 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
cf70: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
cf80: 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
cf90: 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  xt connection.**
cfa0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
cfb0: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
cfc0: 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
cfd0: 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69   be this one) wi
cfe0: 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61  ll.** roll it ba
cff0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
d000: 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
d010: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
d020: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
d030: 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
d040: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
d050: 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
d060: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
d070: 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
d080: 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
d090: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
d0a0: 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63 68  ror state. Which
d0b0: 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
d0c0: 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
d0d0: 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
d0e0: 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
d0f0: 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
d100: 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
d110: 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
d120: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d130: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
d140: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
d150: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
d160: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
d170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
d180: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
d190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d1a0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
d1b0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  r);.    sqlite3E
d1c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d1d0: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
d1e0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
d1f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d200: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
d210: 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
d220: 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
d230: 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
d240: 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
d250: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
d260: 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
d270: 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
d280: 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
d290: 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
d2a0: 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
d2b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
d2c0: 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d2e0: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
d2f0: 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
d300: 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
d310: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
d320: 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  tion..** .** If 
d330: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d340: 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20  PAGER_SHARED or 
d350: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
d360: 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
d370: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d380: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d390: 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45   (returns SQLITE
d3a0: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK)..**.** Othe
d3b0: 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
d3c0: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
d3d0: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
d3e0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
d3f0: 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
d400: 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
d410: 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
d420: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
d430: 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
d440: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
d450: 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
d460: 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
d470: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
d480: 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
d490: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
d4a0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
d4b0: 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
d4c0: 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
d4d0: 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
d4e0: 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
d4f0: 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
d500: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d510: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
d520: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
d530: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
d540: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
d550: 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
d560: 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
d570: 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
d580: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
d590: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
d5a0: 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
d5b0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
d5c0: 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
d5d0: 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
d5e0: 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
d5f0: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
d600: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
d610: 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
d620: 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
d630: 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
d640: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d650: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
d660: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
d670: 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
d680: 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
d690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d6a0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
d6b0: 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
d6c0: 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
d6d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
d6e0: 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
d6f0: 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
d700: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
d710: 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
d720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
d730: 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
d740: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
d750: 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
d760: 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
d770: 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
d780: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
d790: 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
d7a0: 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
d7b0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d7c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
d7d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
d7e0: 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
d7f0: 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
d800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d810: 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
d820: 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
d830: 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
d840: 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
d850: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
d860: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d870: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
d880: 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
d890: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d8a0: 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
d8b0: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
d8c0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
d8d0: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72   finalized, if r
d8e0: 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
d8f0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d900: 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73  e.** pager moves
d910: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
d920: 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e   state (and down
d930: 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20  grades the lock 
d940: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
d950: 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
d960: 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gly)..**.** If t
d970: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d980: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d990: 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20   mode and is in 
d9a0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
d9b0: 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20  te,.** it moves 
d9c0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
d9d0: 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65  VE. No locks are
d9e0: 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e   downgraded when
d9f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65   running in.** e
da00: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
da10: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
da20: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
da30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
da40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
da50: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
da60: 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
da70: 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
da80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
da90: 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
daa0: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
dab0: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
dac0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
dad0: 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
dae0: 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
daf0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
db00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
db10: 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
db20: 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
db30: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
db40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
db50: 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
db60: 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
db70: 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
db80: 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
db90: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
dba0: 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
dbb0: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
dbc0: 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
dbd0: 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
dbe0: 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
dbf0: 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
dc00: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dc10: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
dc20: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
dc30: 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
dc40: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
dc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc60: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dc70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
dc80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
dc90: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
dca0: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
dcb0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dcc0: 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
dcd0: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
dce0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  /..  if( pPager-
dcf0: 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
dd00: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
dd10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dd20: 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53   }.  releaseAllS
dd30: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
dd40: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  );..  assert( is
dd50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
dd60: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
dd70: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
dd80: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
dd90: 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61  r->jfd) ){.    a
dda0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
ddb0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
ddc0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
ddd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dde0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
ddf0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
de00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
de10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
de20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
de30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
de40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
de50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
de60: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
de80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
dea0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
deb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
dec0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
dee0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
def0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
df10: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
df20: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
df30: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
df40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
df50: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
df60: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
df70: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
df80: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
df90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
dfa0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
dfb0: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
dfc0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
dfd0: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
dfe0: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
dff0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
e000: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
e010: 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
e020: 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
e030: 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
e040: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
e050: 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
e060: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
e070: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
e080: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
e090: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e0a0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
e0b0: 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
e0c0: 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
e0d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
e0e0: 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
e0f0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
e100: 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
e110: 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
e120: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
e130: 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
e140: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
e150: 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
e160: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
e170: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
e180: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
e190: 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
e1a0: 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
e1b0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  y journal. .    
e1c0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
e1d0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
e1e0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e1f0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
e200: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
e210: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
e220: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
e230: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
e240: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
e250: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e270: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
e280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
e290: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
e2a0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
e2b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e2d0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e2e0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
e2f0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e300: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e310: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
e320: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
e330: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
e340: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
e350: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
e360: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
e370: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
e380: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
e390: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
e3a0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
e3b0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
e3c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
e3d0: 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  c = 0;.  sqlite3
e3e0: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
e3f0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
e400: 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
e410: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
e420: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
e430: 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
e440: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
e450: 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
e460: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
e470: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
e480: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
e490: 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ARED;..    /* If
e4a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
e4b0: 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  was in locking_m
e4c0: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
e4d0: 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
e4e0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70  ger,.    ** drop
e4f0: 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
e500: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e510: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
e520: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
e530: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
e540: 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
e550: 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
e560: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
e570: 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d 20   ){.      rc2 = 
e580: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
e590: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
e5a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
e5b0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
e5c0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
e5d0: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
e5e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
e5f0: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
e600: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e610: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
e620: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
e630: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
e640: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
e650: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
e660: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
e670: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
e680: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
e690: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
e6a0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
e6b0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
e6c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   0;.  pPager->db
e6d0: 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20  Modified = 0;.. 
e6e0: 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69   /* TODO: Is thi
e6f0: 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69  s optimal? Why i
e700: 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e  s the db size in
e710: 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a  validated here .
e720: 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61    ** when the da
e730: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
e740: 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a  ot unlocked? */.
e750: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
e760: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Size = 0;.  sqli
e770: 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
e780: 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
e790: 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
e7a0: 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  e);.  if( !MEMDB
e7b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e7c0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
e7d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
e7e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
e7f0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
e800: 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
e810: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
e820: 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
e830: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
e840: 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
e850: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
e860: 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
e870: 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
e880: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
e890: 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
e8a0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e8b0: 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
e8c0: 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
e8d0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
e8e0: 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
e8f0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
e900: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
e910: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
e920: 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
e930: 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
e940: 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
e950: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
e960: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
e970: 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
e980: 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
e990: 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
e9a0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
e9b0: 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
e9c0: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
e9d0: 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
e9e0: 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
e9f0: 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
ea00: 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
ea10: 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
ea20: 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
ea30: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
ea40: 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
ea50: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
ea60: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
ea70: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
ea80: 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
ea90: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
eaa0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
eab0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
eac0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
ead0: 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
eae0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
eaf0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
eb00: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
eb10: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
eb20: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
eb30: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
eb40: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
eb50: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
eb60: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
eb70: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
eb80: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
eb90: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
eba0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
ebb0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
ebc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
ebd0: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
ebe0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
ebf0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ec00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
ec10: 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
ec20: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
ec30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
ec40: 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
ec50: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ec60: 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
ec70: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
ec80: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
ec90: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
eca0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
ecb0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
ecc0: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65  ngle page from e
ecd0: 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ither the journa
ece0: 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69  l file (if isMai
ecf0: 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20  nJrnl==1) or.** 
ed00: 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
ed10: 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a  rnal (if isMainJ
ed20: 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79  rnl==0) and play
ed30: 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a  back that page..
ed40: 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69  ** The page begi
ed50: 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f  ns at offset *pO
ed60: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
ed70: 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65  ile. The *pOffse
ed80: 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e  t.** value is in
ed90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73  creased to the s
eda0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
edb0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
edc0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
edd0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20  isMainJrnl flag 
ede0: 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20  is true if this 
edf0: 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  is the main roll
ee00: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
ee10: 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68  .** false for th
ee20: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
ee30: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72  nal.  The main r
ee40: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
ee50: 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  uses.** checksum
ee60: 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
ee70: 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  t journal does n
ee80: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
ee90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
eea0: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
eeb0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
eec0: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
eed0: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
eee0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
eef0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
ef00: 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
ef10: 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
ef20: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
ef30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
ef40: 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
ef50: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
ef60: 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
ef70: 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
ef80: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
ef90: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
efa0: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
efb0: 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
efc0: 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
efd0: 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
efe0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
eff0: 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
f000: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
f010: 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
f020: 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
f030: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
f040: 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
f050: 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
f060: 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
f070: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
f080: 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
f090: 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
f0a0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
f0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
f0c0: 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
f0d0: 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
f0e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
f0f0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
f100: 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
f110: 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
f120: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
f130: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
f140: 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
f150: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
f160: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
f170: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f180: 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
f190: 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
f1a0: 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
f1b0: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
f1c0: 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
f1d0: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
f1e0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
f1f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
f200: 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
f210: 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
f220: 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
f230: 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
f240: 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
f250: 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
f260: 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
f270: 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
f280: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
f290: 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
f2a0: 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
f2b0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
f2c0: 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
f2d0: 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
f2e0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
f2f0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
f300: 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
f310: 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
f320: 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
f330: 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
f340: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
f350: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
f360: 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
f370: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
f380: 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
f390: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
f3a0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
f3b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
f3c0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
f3d0: 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
f3e0: 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
f3f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
f400: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
f410: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
f420: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
f430: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
f460: 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
f470: 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
f480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f490: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
f4a0: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
f4b0: 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
f4c0: 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
f4d0: 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
f4e0: 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
f4f0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
f500: 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f520: 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
f530: 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
f540: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
f550: 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
f560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
f570: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
f580: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
f590: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
f5a0: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
f5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
f5c0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
f5d0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
f5e0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f600: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
f610: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
f620: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
f630: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
f640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
f650: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
f660: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
f670: 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
f6a0: 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
f6b0: 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
f6c0: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
f6d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
f6e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
f6f0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
f700: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
f710: 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
f720: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f730: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
f740: 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
f750: 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
f760: 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
f770: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
f780: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
f790: 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
f7a0: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
f7b0: 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
f7c0: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
f7d0: 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
f7e0: 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
f7f0: 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
f800: 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
f810: 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
f820: 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
f830: 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
f840: 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
f850: 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
f860: 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
f870: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f880: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
f890: 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
f8a0: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
f8b0: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
f8c0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
f8d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
f8e0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
f8f0: 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
f900: 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
f910: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
f920: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
f930: 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
f940: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
f950: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
f960: 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
f970: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
f980: 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
f990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f9a0: 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
f9b0: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
f9c0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
f9d0: 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
f9e0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
f9f0: 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
fa00: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fa10: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
fa20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
fa30: 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
fa40: 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
fa50: 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
fa60: 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
fa70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
fa80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
fa90: 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
faa0: 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
fab0: 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
fac0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
fad0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
fae0: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
faf0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
fb00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
fb10: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
fb20: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
fb30: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
fb40: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
fb50: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
fb60: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
fb70: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
fb80: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
fb90: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
fba0: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
fbb0: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
fbc0: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
fbd0: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
fbe0: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
fbf0: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
fc00: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
fc10: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
fc20: 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
fc30: 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
fc40: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fc50: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
fc60: 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
fc70: 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
fc80: 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
fc90: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
fca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fcb0: 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
fcc0: 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
fcd0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
fce0: 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
fcf0: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
fd00: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
fd10: 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
fd20: 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
fd30: 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
fd40: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
fd50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fd60: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
fd70: 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   }..  if( pDone 
fd80: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
fd90: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
fda0: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
fdb0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
fdc0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
fdd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
fde0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
fdf0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
fe00: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
fe10: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
fe20: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
fe30: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
fe40: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
fe50: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
fe60: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
fe70: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
fe80: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
fe90: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
fea0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
feb0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
fec0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
fed0: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
fee0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
fef0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
ff00: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
ff10: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
ff20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
ff30: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
ff40: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
ff50: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
ff60: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
ff70: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
ff80: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
ff90: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
ffa0: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
ffb0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
ffc0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
ffd0: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
ffe0: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
fff0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
10000 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
10010 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
10020 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
10030 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
10040 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
10050 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
10060 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
10070 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
10080 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
10090 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
100a0 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
100b0 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
100c0 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
100d0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
100e0 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
100f0 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
10100 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
10110 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10120 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
10130 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
10140 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
10150 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
10160 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
10170 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10180 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10190 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
101a0 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
101b0 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
101c0 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
101d0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
101e0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
101f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
10200 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
10210 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
10220 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
10230 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
10240 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
10250 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
10260 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
10270 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
10280 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
10290 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
102a0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
102b0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
102c0 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
102d0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
102e0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
102f0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
10300 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
10310 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
10320 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
10330 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
10340 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
10350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10360 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
10370 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
10380 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
10390 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
103a0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
103b0 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
103c0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
103d0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
103e0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
103f0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
10400 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
10410 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
10420 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
10430 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
10440 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
10450 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
10460 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
10470 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
10480 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
10490 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
104a0 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
104b0 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
104c0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
104d0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
104e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
104f0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
10500 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
10510 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
10520 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
10530 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
10540 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
10550 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
10560 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
10570 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
10580 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
10590 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
105a0 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61  se{.    pPg = pa
105b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
105c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
105d0 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
105e0 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
105f0 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
10600 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
10610 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
10620 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
10630 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
10640 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
10650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
10660 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
10670 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
10680 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
10690 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
106a0 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
106b0 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
106c0 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
106d0 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
106e0 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
106f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
10700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
10710 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
10720 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
10730 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
10740 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
10750 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
10760 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
10770 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28 70  ).   && isOpen(p
10780 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
10790 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
107a0 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
107b0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
107c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
107d0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
107e0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
107f0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
10800 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
10810 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
10820 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
10830 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
10840 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10850 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
10860 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
10870 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
10880 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
10890 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
108a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
108b0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
108c0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
108d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
108e0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
108f0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
10900 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
10910 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
10920 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
10930 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
10940 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
10950 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
10960 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
10970 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
10980 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
10990 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
109a0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
109b0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
109c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
109d0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
109e0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
109f0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
10a00 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
10a10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
10a20 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
10a30 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
10a40 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
10a50 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
10a60 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
10a70 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
10a80 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
10a90 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
10aa0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
10ab0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
10ac0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
10ad0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
10ae0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
10af0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
10b00 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
10b10 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
10b20 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
10b30 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
10b40 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
10b50 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
10b60 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
10b70 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
10b80 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
10b90 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
10ba0 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
10bb0 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
10bc0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
10bd0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
10be0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
10bf0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
10c00 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
10c10 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
10c20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
10c30 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
10c40 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
10c50 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
10c60 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
10c70 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
10c80 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
10c90 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
10ca0 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
10cb0 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
10cc0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
10cd0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
10ce0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
10cf0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
10d00 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
10d10 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
10d20 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
10d30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
10d40 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
10d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
10d60 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
10d70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
10d80 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
10d90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
10da0 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
10db0 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
10dc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10dd0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
10de0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
10df0 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
10e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e10 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
10e20 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
10e30 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
10e40 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
10e50 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
10e60 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
10e70 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
10e80 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
10e90 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
10ea0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
10eb0 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
10ec0 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
10ed0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
10ee0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
10ef0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
10f00 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
10f10 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
10f20 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
10f30 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
10f40 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
10f50 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
10f60 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
10f70 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
10f80 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
10f90 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
10fa0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
10fb0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
10fc0 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
10fd0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
10fe0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
10ff0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
11000 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11010 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
11020 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
11030 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
11040 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
11050 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
11060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
11070 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
11080 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
11090 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
110a0 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
110b0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
110c0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
110d0 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
110e0 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
110f0 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
11100 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
11110 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
11120 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
11130 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
11140 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
11150 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
11160 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
11170 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
11180 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
11190 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
111a0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
111b0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
111c0 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
111d0 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
111e0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
111f0 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
11200 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
11210 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
11220 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
11230 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
11240 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
11250 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
11260 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
11270 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
11280 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
11290 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
112a0 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
112b0 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
112c0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
112d0 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
112e0 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
112f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
11300 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
11310 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
11320 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
11330 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
11340 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
11350 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
11360 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
11370 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
11380 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
11390 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
113a0 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
113b0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
113c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
113d0 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
113e0 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
113f0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
11400 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
11410 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
11420 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
11430 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
11440 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
11450 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
11460 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
11470 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
11480 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
11490 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
114a0 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
114b0 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
114c0 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
114d0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
114e0 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
114f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11500 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
11510 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
11520 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
11530 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
11540 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
11550 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
11560 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
11570 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
11580 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
11590 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
115a0 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
115b0 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
115c0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
115d0 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
115e0 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
115f0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
11600 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
11610 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
11620 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
11630 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
11640 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
11650 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
11660 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
11670 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
11680 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
11690 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
116a0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
116b0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
116c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
116d0 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
116e0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
116f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
11710 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
11720 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
11730 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11740 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
11750 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
11760 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
11770 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11780 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
11790 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
117a0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
117b0 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
117c0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
117d0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
117e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
117f0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
11800 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
11810 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
11820 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
11830 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
11840 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
11850 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
11860 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
11870 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11880 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
11890 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
118a0 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
118b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
118c0 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
118d0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
118e0 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
118f0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
11900 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
11910 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
11920 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
11930 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
11940 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
11950 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
11960 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
11970 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
11980 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11990 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
119a0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
119b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
119c0 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
119d0 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
119e0 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
119f0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
11a00 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
11a10 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
11a20 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
11a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
11a40 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
11a50 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
11a60 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
11a70 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
11a80 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
11a90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11aa0 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
11ab0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
11ac0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
11ad0 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
11ae0 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
11af0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
11b00 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
11b10 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
11b20 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
11b30 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
11b40 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11b50 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
11b60 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
11b70 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
11b80 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
11b90 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
11ba0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
11bb0 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
11bc0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
11bd0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11be0 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
11bf0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
11c00 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
11c10 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
11c20 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
11c30 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
11c40 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
11c50 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
11c60 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
11c70 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
11c80 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
11c90 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
11ca0 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
11cb0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
11cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
11cd0 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
11ce0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
11cf0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
11d00 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
11d10 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
11d20 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
11d30 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
11d40 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
11d50 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
11d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
11d70 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11d80 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
11d90 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
11da0 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
11db0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11dc0 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
11dd0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
11de0 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
11df0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
11e00 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
11e10 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11e20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11e30 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
11e40 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
11e50 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
11e60 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
11e70 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
11e80 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
11e90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11ea0 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
11eb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11ec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
11ed0 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
11ee0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
11ef0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
11f00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11f10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11f20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
11f30 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
11f40 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
11f50 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
11f60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
11f70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
11f80 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
11f90 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
11fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
11fb0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
11fc0 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
11fd0 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
11fe0 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
11ff0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
12000 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
12010 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
12020 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
12030 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
12040 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
12050 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12060 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
12070 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
12080 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
12090 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
120a0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
120b0 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
120c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
120d0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
120e0 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
120f0 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
12100 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
12110 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
12120 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
12130 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
12140 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
12150 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
12160 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
12170 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
12180 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12190 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
121a0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
121b0 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
121c0 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
121d0 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
121e0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
121f0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
12200 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
12210 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
12220 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
12230 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
12240 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12250 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
12260 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
12270 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
12280 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
12290 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
122a0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
122b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
122c0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
122d0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
122e0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
122f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
12300 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12310 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
12320 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
12330 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
12340 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
12350 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
12360 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
12370 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
12380 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
12390 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
123a0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
123b0 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
123c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
123d0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
123e0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
123f0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
12400 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
12410 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
12420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12430 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
12440 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
12450 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12460 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
12470 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
12480 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
12490 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
124a0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
124b0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
124c0 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
124d0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
124e0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
124f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12500 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12510 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
12520 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
12530 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
12540 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
12550 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
12560 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
12570 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
12580 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
12590 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
125a0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
125b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
125c0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
125d0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
125e0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
125f0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
12600 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
12610 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
12620 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
12630 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
12640 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
12650 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
12660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12670 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
12680 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
12690 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
126a0 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
126b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
126c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
126d0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
126e0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
126f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
12700 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
12710 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
12720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12730 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
12740 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
12750 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
12760 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
12770 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
12780 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
12790 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
127a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
127b0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
127c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
127d0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
127e0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
127f0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
12800 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
12810 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12820 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12830 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
12840 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
12850 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12870 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12880 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12890 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
128a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
128b0 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
128c0 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
128d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
128e0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
128f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12910 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12920 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12930 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
12940 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
12950 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
12960 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
12970 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
12980 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
12990 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
129a0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
129b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
129c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
129d0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
129e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
129f0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
12a00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12a10 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
12a20 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
12a30 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
12a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
12a50 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12a60 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
12a70 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
12a80 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
12a90 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
12aa0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
12ab0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
12ac0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
12ad0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
12ae0 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
12af0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
12b00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12b10 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
12b20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12b30 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
12b40 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
12b50 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
12b60 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
12b70 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
12b80 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
12b90 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
12ba0 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
12bb0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
12bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
12bd0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
12be0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
12bf0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
12c00 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
12c10 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
12c20 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
12c30 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
12c40 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
12c50 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
12c60 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
12c70 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
12c80 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
12c90 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
12ca0 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
12cb0 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
12cc0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
12cd0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
12ce0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
12cf0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
12d00 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
12d10 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
12d20 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
12d30 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
12d40 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
12d50 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
12d60 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
12d70 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
12d80 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
12d90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12da0 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
12db0 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
12dc0 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
12dd0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
12de0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
12df0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
12e00 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
12e10 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
12e20 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
12e30 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
12e40 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
12e50 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
12e60 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
12e70 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
12e80 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
12e90 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
12ea0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
12eb0 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
12ec0 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
12ed0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
12ee0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
12ef0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
12f00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12f10 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
12f20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
12f30 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
12f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12f50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12f60 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
12f70 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
12f80 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
12f90 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
12fa0 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
12fb0 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
12fc0 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
12fd0 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
12fe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12ff0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13000 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
13010 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
13020 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
13030 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
13040 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13050 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
13060 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
13070 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
13080 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
13090 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
130a0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
130b0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
130c0 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
130d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
130e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
130f0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
13100 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
13110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13130 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
13140 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
13150 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
13160 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13170 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13180 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
13190 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
131a0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
131b0 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
131c0 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
131d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
131e0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
131f0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
13200 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
13210 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
13220 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
13230 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
13240 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
13250 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
13260 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
13270 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
13280 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
13290 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
132a0 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
132b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
132c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
132d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
132e0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
132f0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
13300 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
13310 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
13320 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
13330 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
13340 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
13350 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
13360 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
13370 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
13380 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
13390 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
133a0 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
133b0 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
133c0 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
133d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
133e0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
133f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13400 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
13410 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
13420 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13430 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
13440 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
13450 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13460 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
13470 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
13480 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
13490 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
134a0 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
134b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
134c0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
134d0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
134e0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
134f0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
13500 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
13510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
13520 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
13530 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
13540 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
13550 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
13560 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
13570 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  32 ){.    pPager
13580 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
13590 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  12;.  }.  if( pP
135a0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
135b0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
135c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
135d0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
135e0 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67  =512 );.    pPag
135f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
13600 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
13610 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
13620 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
13630 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
13640 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
13650 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
13660 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
13670 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
13680 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
13690 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
136a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
136b0 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
136c0 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
136d0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
136e0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
136f0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
13700 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
13710 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
13720 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
13730 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
13740 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
13750 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
13760 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
13770 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
13780 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
13790 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
137a0 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
137b0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
137c0 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
137d0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
137e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
137f0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
13800 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
13810 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
13820 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
13830 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
13840 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13850 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
13860 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
13870 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
13880 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
13890 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
138a0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
138b0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
138c0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
138d0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
138e0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
138f0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
13900 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
13910 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
13920 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
13930 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
13940 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
13950 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
13960 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
13970 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
13980 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
13990 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
139a0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
139b0 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
139c0 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
139d0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
139e0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
139f0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
13a00 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
13a10 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
13a20 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
13a30 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
13a40 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
13a50 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
13a60 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
13a70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
13a80 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13a90 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
13aa0 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
13ab0 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
13ac0 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
13ad0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
13ae0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
13af0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
13b00 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
13b10 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
13b20 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
13b30 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
13b40 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
13b50 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13b60 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
13b70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
13b80 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
13b90 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
13ba0 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
13bb0 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
13bc0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
13bd0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
13be0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
13bf0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
13c00 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
13c10 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
13c20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
13c30 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
13c40 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
13c50 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
13c60 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
13c70 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13c80 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
13c90 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
13ca0 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
13cb0 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
13cc0 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
13cd0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
13ce0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
13cf0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
13d00 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
13d10 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13d20 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
13d30 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
13d40 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
13d50 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
13d60 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
13d70 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
13d80 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
13d90 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
13da0 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
13db0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
13dc0 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
13dd0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
13de0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
13df0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
13e00 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
13e10 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
13e20 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
13e30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
13e40 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
13e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13e60 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
13e70 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
13e80 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
13e90 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
13ea0 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
13eb0 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
13ec0 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
13ed0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
13ee0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
13ef0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
13f00 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
13f10 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
13f20 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
13f30 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
13f40 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
13f50 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
13f60 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
13f70 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
13f80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
13f90 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
13fa0 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
13fb0 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
13fc0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
13fd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
13fe0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
13ff0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
14000 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
14010 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
14020 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
14030 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
14040 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
14050 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14060 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
14070 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
14080 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
14090 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
140a0 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
140b0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
140c0 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
140d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
140e0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
140f0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
14100 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
14110 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
14120 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
14130 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
14140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
14150 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
14160 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
14170 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
14180 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
14190 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
141a0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
141b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
141c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
141d0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
141e0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
141f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14200 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
14210 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
14220 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
14230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
14240 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
14250 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
14260 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
14270 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
14280 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
14290 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
142a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
142b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
142c0 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
142d0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
142e0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
142f0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
14300 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
14310 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
14320 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
14330 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
14340 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
14350 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
14360 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
14370 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
14380 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
14390 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
143a0 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
143b0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
143c0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
143d0 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
143e0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
143f0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
14400 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
14410 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
14420 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
14430 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
14440 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
14450 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
14460 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
14470 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
14480 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
14490 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
144a0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
144b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
144c0 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
144d0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
144e0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
144f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
14500 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
14510 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
14520 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
14530 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
14540 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
14550 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
14560 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
14570 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
14580 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
14590 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
145a0 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
145b0 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
145c0 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
145d0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
145e0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
145f0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
14600 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
14610 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
14620 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
14630 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
14640 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14650 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
14660 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
14670 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
14680 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
14690 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
146a0 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
146b0 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
146c0 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
146d0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
146e0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
146f0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
14700 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
14710 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
14720 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
14730 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
14740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
14750 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
14760 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
14770 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
14780 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
14790 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
147a0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
147b0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
147c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
147d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
147e0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
147f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14800 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
14810 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
14820 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
14830 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
14840 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
14850 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
14860 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
14870 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
14880 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
14890 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
148a0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
148b0 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
148c0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
148d0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
148e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
148f0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
14900 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
14910 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
14920 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
14930 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14940 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
14950 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
14960 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
14970 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
14980 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
14990 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
149a0 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
149b0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
149c0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
149d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
149e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
149f0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
14a00 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
14a10 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
14a20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
14a40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14a50 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14a80 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14a90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14aa0 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
14ab0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
14ac0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
14ad0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
14ae0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
14af0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
14b00 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
14b10 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
14b20 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
14b30 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
14b40 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
14b50 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
14b60 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
14b70 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
14b80 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
14b90 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
14ba0 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
14bb0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
14bc0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
14bd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14be0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
14bf0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
14c00 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
14c10 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14c20 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
14c30 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
14c40 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
14c50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14c60 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
14c70 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
14c80 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
14c90 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
14ca0 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
14cb0 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
14cc0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
14cd0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
14ce0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
14cf0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
14d00 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
14d10 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
14d20 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
14d30 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
14d40 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
14d50 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
14d60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
14d70 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
14d80 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
14d90 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
14da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
14db0 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
14dc0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
14dd0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
14de0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
14df0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
14e00 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
14e10 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
14e20 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
14e30 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
14e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
14e50 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
14e60 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
14e70 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
14e80 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
14e90 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
14ea0 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
14eb0 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
14ec0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
14ed0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
14ee0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
14ef0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
14f00 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
14f10 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
14f20 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
14f30 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
14f40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
14f50 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
14f60 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
14f70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14f80 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
14f90 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
14fa0 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
14fb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
14fc0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
14fd0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
14fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14ff0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
15000 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
15010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15020 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
15030 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
15040 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
15050 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15060 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
15070 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
15080 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
15090 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
150a0 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
150b0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
150c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
150d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
150e0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
150f0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
15100 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
15110 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
15120 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15140 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
15150 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
15160 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
15170 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
15180 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
15190 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
151a0 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
151b0 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
151c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
151d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
151e0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
151f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
15200 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
15210 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
15220 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
15230 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
15240 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
15250 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
15260 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
15270 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
15280 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
15290 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
152a0 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
152b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
152c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
152d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
152e0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
152f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15300 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
15310 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15320 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
15330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
15350 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
15360 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
15370 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15380 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
15390 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70   truncated, simp
153a0 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  ly stop reading 
153b0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
153c0 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
153d0 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69  journal. This mi
153e0 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68  ght happen if th
153f0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  e journal was.  
15400 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63          ** not c
15410 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65  ompletely writte
15420 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69  n and synced pri
15430 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20  or to a crash.  
15440 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  In that.        
15450 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64    ** case, the d
15460 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68  atabase should h
15470 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77  ave never been w
15480 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20  ritten in the.  
15490 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
154a0 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20   place so it is 
154b0 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61  OK to simply aba
154c0 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  ndon the rollbac
154d0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
154e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
154f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
15500 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
15510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15520 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
15530 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
15540 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
15550 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
15560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
15570 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
15580 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
15590 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
155a0 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
155b0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
155c0 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
155d0 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
155e0 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
155f0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
15600 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
15610 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
15620 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
15630 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
15640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
15650 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
15660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15670 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
15680 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
15690 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
156a0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
156b0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
156c0 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
156d0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
156e0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
156f0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
15700 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
15710 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
15720 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
15730 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
15740 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
15750 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
15760 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
15770 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
15780 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
15790 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
157a0 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
157b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
157c0 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
157d0 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
157e0 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
157f0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
15800 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
15810 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
15820 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
15830 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15840 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
15850 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
15860 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
15870 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
15880 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15890 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
158a0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
158b0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
158c0 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
158d0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
158e0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
158f0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
15900 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
15910 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
15920 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
15930 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
15940 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
15950 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
15960 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
15970 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
15980 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
15990 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
159a0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
159b0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
159c0 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
159d0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
159e0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
159f0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
15a00 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
15a10 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
15a20 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
15a30 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
15a40 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
15a50 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
15a60 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
15a70 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
15a80 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
15a90 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
15aa0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
15ab0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
15ad0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
15ae0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
15af0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
15b00 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
15b10 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
15b20 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
15b30 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
15b40 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15b50 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
15b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15b70 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
15b80 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
15b90 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
15ba0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
15bb0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15bc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
15bd0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
15be0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
15bf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
15c00 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
15c10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15c20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
15c30 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15c40 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
15c50 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
15c60 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
15c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15c80 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
15c90 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
15ca0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
15cb0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
15cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15cd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15ce0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
15cf0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
15d00 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
15d10 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
15d20 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
15d30 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
15d40 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
15d50 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
15d60 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
15d70 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
15d80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
15d90 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
15da0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
15db0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
15dc0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
15dd0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
15de0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
15df0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
15e00 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
15e10 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
15e20 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
15e30 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
15e40 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
15e50 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
15e60 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
15e70 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
15e80 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
15e90 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
15ea0 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
15eb0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
15ec0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
15ed0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15ee0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
15ef0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
15f00 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
15f10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15f20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  and into .** pPg
15f30 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
15f40 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
15f50 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
15f60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
15f70 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
15f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15f90 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
15fa0 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
15fb0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
15fc0 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
15fd0 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
15fe0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
15ff0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
16000 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
16010 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
16020 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
16030 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
16040 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
16050 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
16060 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16070 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
16080 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
16090 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
160a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
160b0 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
160c0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
160d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
160e0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
160f0 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
16100 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
16110 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
16120 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
16130 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
16140 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
16150 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c  */.  int isInWal
16160 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16170 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67    /* True if pag
16180 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65  e is in log file
16190 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
161a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
161b0 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
161c0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
161d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
161e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
161f0 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44  _SHARED && !MEMD
16200 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
16210 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16220 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
16230 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  R(!isOpen(pPager
16240 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73  ->fd)) ){.    as
16250 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
16260 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65  mpFile );.    me
16270 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
16280 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
16290 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Size);.    retur
162a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
162b0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
162c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
162d0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
162e0 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
162f0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
16300 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
16310 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28   sqlite3WalRead(
16320 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
16330 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67  no, &isInWal, pg
16340 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
16350 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16360 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49  QLITE_OK && !isI
16370 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20  nWal ){.    i64 
16380 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
16390 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
163a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
163b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
163c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
163d0 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
163e0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
163f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
16400 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
16410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16420 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
16430 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
16440 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
16450 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16460 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
16470 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
16480 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
16490 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
164a0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
164b0 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
164c0 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
164d0 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
164e0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
164f0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
16500 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
16510 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
16520 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
16530 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
16540 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
16550 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
16560 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
16570 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
16580 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
16590 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
165a0 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
165b0 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
165c0 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
165d0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
165e0 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
165f0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
16600 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16610 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
16620 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
16630 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
16640 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
16650 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
16660 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
16670 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
16680 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
16690 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
166a0 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
166b0 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
166c0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
166d0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
166e0 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
166f0 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
16700 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
16710 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
16720 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
16730 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
16740 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
16750 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16760 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
16770 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
16780 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
16790 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
167a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
167b0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
167c0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
167d0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
167e0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
167f0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
16800 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
16810 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
16820 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
16830 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
16840 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
16850 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
16860 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
16870 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
16880 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
16890 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
168a0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
168b0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
168c0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
168d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
168e0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
168f0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
16900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
16910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
16920 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
16930 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
16940 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
16950 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
16960 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
16970 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16980 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
16990 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
169a0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
169b0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
169c0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
169d0 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
169e0 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
169f0 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
16a00 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
16a10 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
16a20 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
16a30 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
16a40 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
16a50 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
16a60 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
16a70 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
16a80 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
16a90 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
16aa0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
16ab0 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
16ac0 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
16ad0 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
16ae0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
16af0 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
16b00 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
16b10 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
16b20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
16b30 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
16b40 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
16b50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
16b60 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
16b70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
16b80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
16b90 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
16ba0 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
16bb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16bc0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
16bd0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
16be0 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
16bf0 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20   *pPg;..  pPg = 
16c00 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
16c10 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
16c20 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
16c30 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
16c40 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
16c50 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
16c60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
16c70 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
16c80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
16c90 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
16ca0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16cc0 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
16cd0 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
16ce0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16cf0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
16d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16d10 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
16d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
16d30 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
16d40 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
16d50 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
16d60 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
16d70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
16d80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16d90 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
16da0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
16db0 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
16dc0 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
16dd0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
16de0 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
16df0 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
16e00 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
16e10 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
16e20 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
16e30 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
16e40 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
16e50 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
16e60 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
16e70 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
16e80 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
16e90 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
16ea0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
16eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
16ec0 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
16ed0 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
16ee0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16ef0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
16f00 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
16f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16f20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16f30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
16f40 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
16f50 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
16f60 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
16f70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
16f80 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
16f90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
16fa0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fc0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
16fd0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
17000 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
17010 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
17020 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
17030 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
17040 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
17050 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
17060 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
17070 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
17080 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
17090 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
170a0 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
170b0 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
170c0 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
170d0 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
170e0 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
170f0 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
17100 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
17110 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
17120 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
17130 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
17140 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
17150 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
17160 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
17170 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
17180 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
17190 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
171a0 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
171b0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
171c0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
171d0 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
171e0 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
171f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
17200 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
17210 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
17220 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
17230 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
17240 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
17250 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
17260 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
17270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17280 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17290 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
172a0 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
172b0 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
172c0 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
172d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
172e0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
172f0 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
17300 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
17310 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
17320 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
17330 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
17340 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
17350 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
17360 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
17370 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
17380 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
17390 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
173c0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
173d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
173e0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
173f0 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
17400 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
17410 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17420 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
17430 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
17440 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
17450 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20  sCommit,        
17460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17470 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
17480 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17490 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20  sync_flags      
174a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
174b0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
174c0 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20  OsSync() (or 0) 
174d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
17500 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
17510 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
17520 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  l );.  rc = sqli
17530 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
17540 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
17550 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17560 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
17570 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
17580 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a  sync_flags.  );.
17590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
175a0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
175b0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
175c0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
175d0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
175e0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
175f0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
17600 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
17610 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
17620 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
17630 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
17650 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
17660 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
17670 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
17680 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
17690 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
176a0 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
176b0 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
176c0 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
176d0 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
176e0 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
176f0 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
17700 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
17710 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
17720 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
17730 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
17740 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
17750 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
17760 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
17770 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
17780 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17790 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
177a0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
177b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
177c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
177e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
177f0 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
17800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17810 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
17820 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
17830 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
17840 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17850 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  ) );..  /* sqlit
17860 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
17870 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
17880 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
17890 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
178a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
178b0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
178c0 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
178d0 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
178e0 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
178f0 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
17900 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
17910 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
17920 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
17930 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
17940 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
17950 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
17960 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
17970 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
17980 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
17990 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
179a0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
179b0 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
179c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
179d0 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b  {.    int dummy;
179e0 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 64  .    if( changed
179f0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
17a00 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17a20 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
17a30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
17a40 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lid==0 );.    }.
17a50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17a60 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17a70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a  Pager, &dummy);.
17a80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
17a90 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
17aa0 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ED;..  return rc
17ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
17ac0 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
17ad0 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
17ae0 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
17af0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
17b00 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e 20  ager.** exists. 
17b10 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
17b20 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70  r occurs, set *p
17b30 45 78 69 73 74 73 20 74 6f 20 31 20 69 66 20 74  Exists to 1 if t
17b40 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 0a  he file exists,.
17b50 2a 2a 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  ** or 0 otherwis
17b60 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
17b70 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
17b80 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   or OOM error oc
17b90 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
17ba0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
17bb0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
17bc0 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c 28  int pagerHasWAL(
17bd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
17be0 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
17bf0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
17c20 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17c50 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a  he WAL file */..
17c60 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
17c70 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
17c80 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zWal = sqlite3_
17c90 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c 22  mprintf("%s-wal"
17ca0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
17cb0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 57 61  ame);.  if( !zWa
17cc0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
17cd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
17ce0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
17cf0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 50  lite3OsAccess(pP
17d00 61 67 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61 6c  ager->pVfs, zWal
17d10 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
17d20 45 58 49 53 54 53 2c 20 70 45 78 69 73 74 73 29  EXISTS, pExists)
17d30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
17d40 65 65 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20 20  ee(zWal);.  }.  
17d50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17d60 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
17d70 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
17d80 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
17d90 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
17da0 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
17db0 20 65 78 69 73 74 73 2e 20 49 66 20 69 74 20 64   exists. If it d
17dc0 6f 65 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61  oes, open the pa
17dd0 67 65 72 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  ger in WAL mode.
17de0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
17df0 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
17e00 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
17e10 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
17e20 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 50 41 47  s not set to PAG
17e30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
17e40 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  AL..** If an IO 
17e50 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  or OOM error occ
17e60 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
17e70 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
17e80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
17e90 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  AL file is opene
17ea0 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20 73  d, also open a s
17eb0 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74 72  napshot (read tr
17ec0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
17ed0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
17ee0 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
17ef0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17f00 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
17f10 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
17f20 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
17f30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
17f40 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
17f50 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
17f60 74 65 20 0a 2a 2a 20 61 20 57 41 4c 2c 20 74 68  te .** a WAL, th
17f70 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
17f80 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
17f90 69 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 74 68  ition between th
17fa0 65 20 78 41 63 63 65 73 73 28 29 20 0a 2a 2a 20  e xAccess() .** 
17fb0 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
17fc0 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
17fd0 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  cuted by some ot
17fe0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
17ff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18000 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
18010 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
18020 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
18030 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
18040 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
18050 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57  e ){.    int isW
18060 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
18070 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18080 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74  f WAL file exist
18090 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61  s */.    rc = pa
180a0 67 65 72 48 61 73 57 41 4c 28 70 50 61 67 65 72  gerHasWAL(pPager
180b0 2c 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20 69  , &isWal);.    i
180c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
180d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
180e0 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Wal ){.        p
180f0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
18100 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
18110 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
18120 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
18130 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18150 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
18160 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
18170 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
18180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18190 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
181a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
181b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
181c0 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
181d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
181e0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
181f0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
18200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18210 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18220 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
18230 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
18240 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
18250 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
18260 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
18270 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
18280 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
18290 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
182a0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
182b0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
182c0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
182d0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
182e0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
182f0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
18300 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
18310 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
18320 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
18330 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
18340 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
18350 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
18360 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
18370 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
18380 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
18390 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
183a0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
183b0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
183c0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
183d0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
183e0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
183f0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
18400 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
18410 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
18420 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
18430 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
18440 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
18450 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
18460 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
18470 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
18480 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
18490 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
184a0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
184b0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
184c0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
184d0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
184e0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
184f0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
18500 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
18510 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
18520 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
18530 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
18540 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
18550 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
18560 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
18570 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
18580 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
18590 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
185a0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
185b0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
185c0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
185d0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
185e0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
185f0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
18600 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
18610 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
18620 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
18630 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
18640 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
18650 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
18660 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
18670 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
18680 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
18690 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
186a0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
186b0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
186c0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
186d0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
186e0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
186f0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
18700 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
18710 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
18720 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
18730 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
18740 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
18750 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
18760 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
18770 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
18780 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
18790 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
187a0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
187b0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
187c0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
187d0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
187e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
187f0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
18800 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
18810 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
18820 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
18830 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
18840 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
18850 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
18860 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
18870 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
18880 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
18890 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
188a0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
188b0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
188c0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
188d0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
188e0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
188f0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
18900 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
18910 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
18920 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
18930 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
18940 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
18950 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
18960 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
18970 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
18980 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
18990 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
189a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
189b0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
189c0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
189d0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
189e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
189f0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
18a00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
18a10 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
18a20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
18a30 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
18a40 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
18a50 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
18a60 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18a70 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
18a80 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
18a90 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
18aa0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
18ab0 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
18ac0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
18ad0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
18ae0 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
18af0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
18b00 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
18b10 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
18b20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18b30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18b40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
18b50 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
18b60 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
18b70 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
18b80 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
18b90 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
18ba0 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
18bb0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
18bc0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
18bd0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
18be0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
18bf0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
18c00 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
18c10 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
18c20 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
18c30 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
18c40 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
18c50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
18c60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18c70 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
18c80 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
18c90 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
18ca0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
18cb0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
18cc0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
18cd0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
18ce0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
18cf0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
18d00 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
18d10 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
18d20 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
18d30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18d40 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
18d50 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
18d60 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
18d70 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
18d80 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
18d90 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
18da0 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
18db0 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
18dc0 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
18dd0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
18de0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
18df0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
18e00 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
18e10 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18e20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
18e30 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
18e40 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
18e50 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
18e60 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
18e70 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
18e80 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
18e90 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
18ea0 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
18eb0 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
18ec0 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
18ed0 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
18ee0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
18ef0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
18f00 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
18f10 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
18f20 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
18f30 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
18f40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
18f50 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
18f60 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
18f70 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
18f80 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
18f90 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
18fa0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
18fb0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
18fc0 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
18fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18ff0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
19000 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
19010 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
19020 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
19030 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
19040 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
19050 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
19060 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
19070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
19080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19090 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
190a0 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
190b0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
190c0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
190d0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
190e0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
190f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
19100 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
19110 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
19120 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
19130 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
19140 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
19150 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
19160 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
19170 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
19180 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
19190 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
191a0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
191b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
191c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
191d0 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
191e0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
191f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
19200 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
19210 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
19220 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
19230 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
19240 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
19250 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
19260 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
19270 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
19280 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
19290 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
192a0 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
192b0 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
192c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
192d0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
192e0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
192f0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
19300 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
19310 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
19320 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
19330 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
19340 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
19350 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
19360 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
19370 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
19380 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
19390 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
193a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
193b0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
193c0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
193d0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
193e0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
193f0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
19400 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
19410 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
19420 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
19430 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
19440 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
19450 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
19460 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
19470 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
19480 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
19490 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
194a0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
194b0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
194c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
194d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
194e0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
194f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19500 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
19510 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
19520 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
19530 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
19540 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
19550 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
19560 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
19570 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
19580 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
19590 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
195a0 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
195b0 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
195c0 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
195d0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
195e0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
195f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
19600 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
19610 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
19620 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
19630 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
19640 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  et = pSavepoint-
19650 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >iSubRec*(4+pPag
19660 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
19670 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
19680 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
19690 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
196a0 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64  3WalSavepointUnd
196b0 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
196c0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c  pSavepoint->aWal
196d0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
196e0 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
196f0 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
19700 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
19710 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
19720 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
19730 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69  ssert( offset==i
19740 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
19750 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
19760 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
19770 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
19780 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
19790 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
197a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
197b0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
197c0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
197d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
197e0 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
197f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19810 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
19820 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19830 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19840 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
19850 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
19860 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
19870 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
19880 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
19890 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
198a0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
198b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
198c0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
198d0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
198e0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
198f0 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
19900 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
19910 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
19920 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
19930 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
19940 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
19950 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
19960 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
19970 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
19980 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
19990 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
199a0 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
199b0 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
199c0 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
199d0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
199e0 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
199f0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
19a00 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
19a10 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
19a20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
19a30 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
19a40 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
19a50 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
19a60 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
19a80 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
19a90 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
19aa0 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
19ab0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
19ac0 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
19ad0 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
19ae0 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
19af0 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
19b00 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
19b10 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
19b20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
19b30 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
19b40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19b50 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
19b60 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
19b70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
19b80 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
19b90 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
19ba0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
19bb0 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
19bc0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
19bd0 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
19be0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
19bf0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
19c00 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
19c10 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
19c20 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
19c30 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
19c40 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
19c50 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
19c60 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
19c70 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
19c80 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
19c90 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
19ca0 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
19cb0 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
19cc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19cd0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
19ce0 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
19cf0 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
19d00 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
19d10 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
19d20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
19d30 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
19d40 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
19d60 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
19d70 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
19d80 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
19d90 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
19da0 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
19db0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
19dc0 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
19dd0 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
19de0 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
19df0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19e00 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
19e10 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
19e20 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
19e30 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
19e40 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
19e50 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20   bFullFsync){.  
19e60 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
19e70 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
19e80 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
19e90 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
19ea0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
19eb0 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
19ec0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
19ed0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
19ee0 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46  _flags = (bFullF
19ef0 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
19f00 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
19f10 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
19f20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
19f30 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
19f40 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
19f50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
19f60 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
19f70 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
19f80 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
19f90 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
19fa0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
19fb0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
19fc0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
19fd0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
19fe0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
19ff0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
1a000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1a010 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
1a020 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
1a030 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1a040 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
1a050 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
1a060 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
1a070 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
1a080 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
1a090 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1a0a0 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
1a0b0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
1a0c0 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
1a0d0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
1a0e0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
1a0f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
1a100 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
1a110 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
1a120 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
1a130 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
1a140 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
1a150 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
1a160 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
1a170 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
1a180 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
1a190 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
1a1a0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1a1b0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
1a1c0 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
1a1d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1a1e0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
1a1f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1a200 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
1a210 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
1a220 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
1a230 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
1a240 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
1a250 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
1a260 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
1a270 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1a280 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
1a290 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1a2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1a2b0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
1a2c0 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
1a2d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a2f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
1a300 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1a310 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
1a320 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
1a330 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
1a340 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
1a350 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
1a360 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
1a370 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1a380 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
1a390 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1a3a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1a3b0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
1a3c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1a3d0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
1a3e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1a3f0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
1a400 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
1a410 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
1a420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1a430 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
1a440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a450 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
1a460 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
1a470 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1a480 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
1a490 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
1a4a0 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
1a4b0 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
1a4c0 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
1a4d0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
1a4e0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
1a4f0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
1a500 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
1a510 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
1a520 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
1a530 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
1a540 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
1a550 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
1a560 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1a570 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
1a580 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
1a590 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
1a5a0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
1a5b0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
1a5c0 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
1a5d0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
1a5e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1a5f0 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
1a600 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
1a610 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
1a620 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
1a630 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
1a640 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
1a650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1a680 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
1a690 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
1a6a0 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
1a6b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
1a6c0 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
1a6d0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
1a6e0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
1a6f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
1a700 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
1a710 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
1a720 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
1a730 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
1a740 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
1a750 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
1a760 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
1a770 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
1a780 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
1a790 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
1a7a0 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
1a7b0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
1a7c0 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
1a7d0 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
1a7e0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
1a7f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
1a800 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
1a810 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1a840 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
1a850 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
1a860 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
1a870 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
1a880 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
1a890 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
1a8a0 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
1a8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
1a8c0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
1a8d0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
1a8e0 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78  ){  .  pPager->x
1a8f0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
1a900 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
1a910 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1a920 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
1a930 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  dlerArg;.}../*.*
1a940 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
1a950 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
1a960 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
1a970 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
1a980 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
1a990 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1a9a0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
1a9b0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
1a9c0 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
1a9d0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
1a9e0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
1a9f0 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
1aa00 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
1aa10 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
1aa20 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
1aa30 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
1aa60 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
1aa70 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
1aa80 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
1aa90 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
1aaa0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
1aab0 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
1aac0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
1aad0 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
1aae0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
1aaf0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
1ab00 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
1ab10 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
1ab20 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
1ab30 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1ab40 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
1ab50 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1ab60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1ab70 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
1ab80 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
1ab90 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
1aba0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1abb0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
1abc0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
1abd0 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
1abe0 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  T or SQLITE_FULL
1abf0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
1ac00 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
1ac10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1ac20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
1ac30 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
1ac40 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
1ac50 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
1ac60 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
1ac70 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
1ac80 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
1ac90 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
1aca0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
1acb0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
1acc0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
1acd0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
1ace0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
1acf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ad00 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
1ad10 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ad20 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
1ad30 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
1ad40 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
1ad50 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
1ad60 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
1ad70 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
1ad80 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
1ad90 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
1ada0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1adb0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1adc0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
1add0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ade0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
1adf0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
1ae00 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
1ae10 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
1ae20 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
1ae30 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
1ae40 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
1ae50 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
1ae60 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
1ae70 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
1ae80 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
1ae90 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
1aea0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1aeb0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1aec0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
1aed0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
1aee0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
1aef0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
1af00 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
1af10 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
1af20 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
1af30 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
1af40 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
1af50 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
1af60 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
1af70 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
1af80 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
1af90 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
1afa0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
1afb0 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
1afc0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
1afd0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1afe0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
1aff0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
1b000 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1b010 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c   u16 *pPageSize,
1b020 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
1b030 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
1b040 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
1b050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b060 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
1b070 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
1b080 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1b090 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
1b0a0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
1b0b0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
1b0c0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
1b0d0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
1b0e0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
1b0f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1b100 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  0).     && sqlit
1b110 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
1b120 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b130 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61  )==0 .     && pa
1b140 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
1b150 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
1b160 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Size .    ){.   
1b170 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
1b180 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
1b190 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
1b1a0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
1b1b0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
1b1c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1b1d0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
1b1e0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1b1f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1b200 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1b210 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1b220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b230 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
1b240 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
1b250 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
1b260 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
1b270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1b280 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
1b290 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b2a0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
1b2b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
1b2c0 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  pPageSize = (u16
1b2d0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1b2e0 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  e;.    if( nRese
1b2f0 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
1b300 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
1b310 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
1b320 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
1b330 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
1b340 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
1b350 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
1b360 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
1b370 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
1b380 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
1b390 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1b3a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1b3b0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
1b3c0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
1b3d0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
1b3e0 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
1b3f0 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
1b400 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
1b410 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
1b420 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
1b430 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
1b440 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
1b450 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
1b460 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
1b470 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
1b480 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
1b490 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
1b4a0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
1b4b0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
1b4c0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
1b4d0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
1b4e0 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
1b4f0 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
1b500 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
1b510 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
1b520 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
1b530 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1b540 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1b550 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1b560 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
1b570 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
1b580 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
1b590 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
1b5a0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
1b5b0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
1b5c0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1b5d0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
1b5e0 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
1b5f0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
1b600 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
1b610 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1b620 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
1b630 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
1b640 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
1b650 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
1b660 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
1b670 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
1b680 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
1b690 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
1b6a0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ge){.  int nPage
1b6b0 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  ;.  if( mxPage>0
1b6c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1b6d0 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
1b6e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1b6f0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1b700 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71  UNLOCK ){.    sq
1b710 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1b720 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
1b730 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge);.    assert(
1b740 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e   pPager->mxPgno>
1b750 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20 20  =nPage );.  }.  
1b760 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
1b770 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
1b780 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
1b790 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
1b7a0 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
1b7b0 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
1b7c0 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
1b7d0 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
1b7e0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
1b7f0 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
1b800 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
1b810 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
1b820 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
1b830 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
1b840 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
1b850 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
1b860 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
1b870 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
1b880 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
1b890 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
1b8a0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
1b8b0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1b8c0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
1b8d0 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
1b8e0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
1b8f0 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
1b900 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
1b910 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
1b920 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
1b930 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
1b940 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
1b950 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
1b960 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
1b970 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
1b980 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
1b990 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
1b9a0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
1b9b0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
1b9c0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
1b9d0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
1b9e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
1b9f0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
1ba00 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
1ba10 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1ba20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1ba30 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
1ba40 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
1ba50 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1ba60 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
1ba70 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
1ba80 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
1ba90 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
1baa0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
1bab0 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
1bac0 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
1bad0 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
1bae0 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
1baf0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
1bb00 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
1bb10 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
1bb20 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1bb30 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
1bb40 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
1bb50 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
1bb60 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1bb70 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
1bb80 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
1bb90 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
1bba0 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
1bbb0 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
1bbc0 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
1bbd0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
1bbe0 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
1bbf0 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
1bc00 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
1bc10 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1bc20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
1bc30 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
1bc40 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
1bc50 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
1bc60 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1bc70 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
1bc80 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
1bc90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1bca0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
1bcb0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
1bcc0 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
1bcd0 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
1bce0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1bcf0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
1bd00 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
1bd10 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1bd20 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1bd30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1bd40 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
1bd50 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
1bd60 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
1bd70 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
1bd80 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
1bd90 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
1bda0 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
1bdb0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
1bdc0 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
1bdd0 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
1bde0 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
1bdf0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
1be00 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20 30  pPager) );.#if 0
1be10 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
1be20 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1be30 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20    int isInWal = 
1be40 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
1be50 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65  te3WalRead(pPage
1be60 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73 49  r->pWal, 1, &isI
1be70 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29 3b  nWal, N, pDest);
1be80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1be90 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57 61  ITE_OK || isInWa
1bea0 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  l ){.      retur
1beb0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1bec0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73  #endif..  if( is
1bed0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1bee0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
1bef0 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
1bf00 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
1bf10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bf20 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1bf30 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
1bf40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bf50 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1bf60 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1bf70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bf80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bf90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1bfa0 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
1bfb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1bfc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1bfd0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ile associated .
1bfe0 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20  ** with pPager. 
1bff0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
1c000 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  s calculated as 
1c010 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f  (<db file size>/
1c020 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a  <page-size>)..**
1c030 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
1c040 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
1c050 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
1c060 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
1c070 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
1c080 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
1c090 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a  1 page file..**.
1c0a0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1c0b0 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  is in error stat
1c0c0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
1c0d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1c0e0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f  then the.** erro
1c0f0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
1c100 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1c110 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20  nd *pnPage left 
1c120 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a  unchanged. Or,.*
1c130 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79  * if the file sy
1c140 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71  stem has to be q
1c150 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73  ueried for the s
1c160 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1c170 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79  and.** the query
1c180 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73   attempt returns
1c190 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68   an IO error, th
1c1a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
1c1b0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
1c1c0 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1c1d0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
1c1e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1c1f0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1c200 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e  successful, then
1c210 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c220 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
1c230 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  nPage is set to 
1c240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c250 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1c260 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
1c270 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1c280 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1c290 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
1c2a0 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
1c2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1c2c0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1c2d0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1c2e0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
1c2f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1c300 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53 74   in the file. St
1c310 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61 67  ore this in nPag
1c320 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
1c330 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
1c340 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  ){.    nPage = p
1c350 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1c360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c370 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1c380 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 74      /* Error ret
1c390 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
1c3a0 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36 34  ize() */.    i64
1c3b0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1c3c0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a       /* File siz
1c3d0 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75 72  e in bytes retur
1c3e0 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a  ned by OsFileSiz
1c3f0 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  e() */..    if( 
1c400 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1c410 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 73  er) && pPager->s
1c420 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1c430 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK ){.      sqli
1c440 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1c450 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61 67  ger->pWal, &nPag
1c460 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1c470 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1c480 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
1c490 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1c4a0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1c4b0 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ile );.      if(
1c4c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c4d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
1c4e0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
1c4f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1c500 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1c510 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20 20  , &n)) ){.      
1c520 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
1c530 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1c540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c560 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e    }.      if( n>
1c570 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
1c580 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
1c590 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
1c5a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c5b0 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
1c5c0 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
1c5d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
1c5e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c5f0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1c600 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1c610 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c620 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
1c630 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1c640 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1c650 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c660 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  zeValid = 1;.   
1c670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1c680 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1c690 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1c6a0 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1c6b0 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
1c6c0 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
1c6d0 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
1c6e0 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
1c6f0 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
1c700 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
1c710 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
1c720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1c730 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
1c740 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1c750 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
1c760 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Page;.  }..  /* 
1c770 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1c780 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74 75  ariable and retu
1c790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a  rn SQLITE_OK */.
1c7a0 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1c7b0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1c7c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1c7d0 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
1c7e0 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
1c7f0 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
1c800 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
1c810 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
1c820 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
1c830 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
1c840 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c850 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
1c860 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
1c870 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
1c880 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
1c890 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
1c8a0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
1c8b0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
1c8c0 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
1c8d0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
1c8e0 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
1c8f0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
1c900 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
1c910 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
1c920 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
1c930 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
1c940 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
1c950 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
1c960 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
1c970 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1c980 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
1c990 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1c9a0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
1c9b0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
1c9c0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
1c9d0 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
1c9e0 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
1c9f0 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
1ca00 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
1ca10 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
1ca20 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1ca30 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
1ca40 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
1ca50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
1ca60 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ca90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1caa0 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
1cab0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
1cac0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
1cad0 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
1cae0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
1caf0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
1cb00 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
1cb10 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
1cb20 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
1cb30 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1cb40 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
1cb50 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1cb60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1cb70 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
1cb80 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
1cb90 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
1cba0 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a   unknown. It.  *
1cbb0 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  * must not have 
1cbc0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74  been modified at
1cbd0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
1cbe0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1cbf0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1cc00 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
1cc10 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
1cc20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1cc30 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1cc40 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
1cc50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1cc60 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
1cc70 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
1cc80 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
1cc90 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
1cca0 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
1ccb0 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
1ccc0 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
1ccd0 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
1cce0 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
1ccf0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
1cd00 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
1cd10 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1cd20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
1cd30 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
1cd40 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
1cd50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1cd60 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
1cd70 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
1cd80 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61   || (pPager->sta
1cd90 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1cda0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
1cdb0 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
1cdc0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
1cdd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
1cde0 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65  RVED && locktype
1cdf0 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ==PAGER_EXCLUSIV
1ce00 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  E).  );..  if( p
1ce10 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
1ce20 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
1ce30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ce40 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
1ce50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ce60 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1ce70 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
1ce80 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
1ce90 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1cea0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
1ceb0 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
1cec0 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
1ced0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1cef0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28  Pager->state = (
1cf00 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  u8)locktype;.   
1cf10 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
1cf20 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
1cf30 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
1cf40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1cf50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
1cf60 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
1cf70 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1cf80 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
1cf90 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
1cfa0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
1cfb0 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
1cfc0 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
1cfd0 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
1cfe0 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
1cff0 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
1d000 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
1d010 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
1d020 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
1d030 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
1d040 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
1d050 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
1d060 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
1d070 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
1d080 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
1d090 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
1d0a0 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
1d0b0 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
1d0c0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
1d0d0 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
1d0e0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
1d0f0 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
1d100 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
1d110 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
1d120 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
1d130 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
1d140 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1d150 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
1d160 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
1d170 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
1d180 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
1d190 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
1d1a0 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
1d1b0 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
1d1c0 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
1d1d0 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
1d1e0 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
1d1f0 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
1d200 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1d210 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
1d220 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
1d230 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
1d240 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
1d250 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
1d260 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20  aviour would be 
1d270 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
1d280 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
1d290 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
1d2a0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
1d2b0 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
1d2c0 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
1d2d0 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
1d2e0 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
1d2f0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
1d300 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1d310 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
1d320 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
1d330 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
1d340 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
1d350 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
1d360 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
1d370 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
1d380 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
1d390 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
1d3a0 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
1d3b0 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
1d3c0 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
1d3d0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1d3e0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
1d3f0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1d400 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
1d410 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
1d420 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1d430 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
1d440 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
1d450 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
1d460 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
1d470 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
1d480 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
1d490 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1d4a0 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
1d4b0 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
1d4c0 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
1d4d0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
1d4e0 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
1d4f0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
1d500 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1d510 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
1d520 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
1d530 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
1d540 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
1d550 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1d560 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
1d570 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
1d580 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
1d590 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
1d5a0 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
1d5b0 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
1d5c0 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
1d5d0 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
1d5e0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
1d5f0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
1d600 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
1d610 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
1d620 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
1d630 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1d640 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
1d650 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1d660 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
1d670 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1d680 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
1d690 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
1d6a0 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
1d6b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d6c0 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
1d6d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d6e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1d6f0 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67  SERVED );.  pPag
1d700 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
1d710 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e  ge;.  assertTrun
1d720 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
1d730 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Pager);.}.../*.*
1d740 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d750 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
1d760 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f   attempting a ho
1d770 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1d780 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20  ck. It.** syncs 
1d790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d7a0 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73   to disk, then s
1d7b0 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ets pPager->jour
1d7c0 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a  nalHdr to the.**
1d7d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1d7e0 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61  rnal file so tha
1d7f0 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  t the pager_play
1d800 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b  back() routine k
1d810 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  nows.** that the
1d820 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
1d830 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
1d840 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63  nced..**.** Sync
1d850 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d860 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  l to disk before
1d870 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
1d880 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75  oll it back ensu
1d890 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20  res .** that if 
1d8a0 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  a power-failure 
1d8b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
1d8c0 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  e rollback, the 
1d8d0 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20  process that.** 
1d8e0 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63  attempts rollbac
1d8f0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74  k following syst
1d900 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73  em recovery sees
1d910 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61   the same journa
1d920 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20  l.** content as 
1d930 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
1d940 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
1d950 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65  g goes as planne
1d960 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
1d970 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1d980 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  ise, .** an SQLi
1d990 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
1d9a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1d9b0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
1d9c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d9d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d9e0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
1d9f0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1da00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1da10 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1da20 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
1da30 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69  NORMAL);.  }.  i
1da40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1da50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1da60 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1da70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
1da80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1da90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1daa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
1dab0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
1dac0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
1dad0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
1dae0 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
1daf0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
1db00 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
1db10 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
1db20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
1db30 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
1db40 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1db50 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
1db60 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
1db70 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
1db80 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
1db90 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
1dba0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
1dbb0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
1dbc0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
1dbd0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
1dbe0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1dbf0 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
1dc00 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
1dc10 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
1dc20 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
1dc30 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
1dc40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1dc50 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
1dc60 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
1dc70 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
1dc80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1dc90 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
1dca0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
1dcb0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
1dcc0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
1dcd0 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
1dce0 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
1dcf0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1dd00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1dd10 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
1dd20 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70  pPager){.  u8 *p
1dd30 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
1dd40 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
1dd50 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
1dd60 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
1dd70 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
1dd80 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1dd90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1dda0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1ddb0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
1ddc0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
1ddd0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
1dde0 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
1ddf0 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20 28  ger->pWal,.    (
1de00 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
1de10 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e   0 : pPager->syn
1de20 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20 70  c_flags), .    p
1de30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1de40 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50 61   pTmp.  );.  pPa
1de50 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
1de60 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
1de70 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
1de80 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1de90 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
1dea0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
1deb0 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e     /* Set Pager.
1dec0 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31  journalHdr to -1
1ded0 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74   for the benefit
1dee0 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c   of the pager_pl
1def0 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a  ayback() .    **
1df00 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20   call which may 
1df10 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74  be made from wit
1df20 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  hin pagerUnlockA
1df30 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66  ndRollback(). If
1df40 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
1df50 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75  t -1, then the u
1df60 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
1df70 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  of an open journ
1df80 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20  al file may.    
1df90 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ** be played bac
1dfa0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
1dfb0 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
1dfc0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
1dfd0 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
1dfe0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
1dff0 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1e000 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
1e010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
1e020 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1e030 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  d) ){.      pPag
1e040 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 61  er->errCode = pa
1e050 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1e060 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
1e070 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
1e080 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
1e090 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
1e0a0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
1e0b0 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
1e0c0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1e0d0 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
1e0e0 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
1e0f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e100 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
1e110 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
1e120 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
1e130 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
1e140 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  fd);.  sqlite3Os
1e150 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1e160 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1e170 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
1e180 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
1e190 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e1a0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1e1b0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
1e1c0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
1e1d0 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
1e1e0 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
1e1f0 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
1e200 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
1e210 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
1e220 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
1e230 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1e240 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
1e250 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
1e260 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
1e270 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
1e280 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
1e290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e2a0 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
1e2b0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
1e2c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1e2d0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1e2e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e2f0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
1e300 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
1e310 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
1e320 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1e330 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
1e340 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1e350 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
1e360 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
1e370 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
1e380 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
1e390 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
1e3a0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1e3b0 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
1e3c0 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
1e3d0 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
1e3e0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
1e3f0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
1e400 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
1e410 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1e420 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
1e430 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
1e440 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
1e450 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
1e460 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
1e470 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
1e480 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1e490 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1e4a0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
1e4b0 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  lag is not set, 
1e4c0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1e4d0 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  on is a.** no-op
1e4e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1e4f0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
1e500 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
1e510 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20  journal-mode.** 
1e520 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63  and the device c
1e530 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
1e540 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73  f the the file-s
1e550 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
1e560 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
1e570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1e580 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1e590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
1e5a0 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
1e5b0 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
1e5c0 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
1e5d0 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
1e5e0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
1e5f0 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
1e600 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
1e610 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
1e620 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
1e630 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
1e640 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
1e650 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
1e660 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
1e670 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
1e680 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
1e690 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
1e6a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
1e6b0 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
1e6c0 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
1e6d0 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
1e6e0 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
1e6f0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1e700 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
1e710 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
1e720 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
1e730 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
1e740 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
1e750 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
1e760 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
1e770 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
1e780 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1e790 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
1e7a0 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
1e7b0 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
1e7c0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1e7d0 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
1e7e0 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
1e7f0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
1e800 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
1e810 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1e820 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
1e830 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
1e840 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
1e850 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
1e860 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
1e870 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1e880 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
1e890 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   The Pager.needS
1e8a0 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65  ync flag is neve
1e8b0 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d  r be set for tem
1e8c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72  porary files, or
1e8d0 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   any.** file ope
1e8e0 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  rating in no-syn
1e8f0 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f  c mode (Pager.no
1e900 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d  Sync set to non-
1e910 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  zero)..**.** If 
1e920 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
1e930 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
1e940 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1e950 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
1e960 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
1e970 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
1e980 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
1e990 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
1e9a0 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
1e9b0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1e9c0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1e9d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1e9e0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1e9f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1ea00 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
1ea10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ea20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
1ea30 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
1ea40 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1ea50 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1ea60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ea70 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1ea80 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
1ea90 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20  {.      int rc; 
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eac0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1ead0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
1eae0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1eaf0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1eb00 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1eb10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1eb20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1eb30 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
1eb40 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1eb50 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1eb60 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
1eb70 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
1eb80 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
1eb90 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
1eba0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
1ebb0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
1ebc0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
1ebd0 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
1ebe0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
1ebf0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
1ec00 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
1ec10 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1ec20 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
1ec30 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
1ec40 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
1ec50 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
1ec60 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
1ec70 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
1ec80 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
1ec90 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1eca0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
1ecb0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1ecc0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
1ecd0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
1ece0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
1ecf0 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
1ed00 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
1ed10 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
1ed20 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
1ed30 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
1ed40 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
1ed50 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
1ed60 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
1ed70 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
1ed80 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
1ed90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1eda0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
1edb0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
1edc0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1edd0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
1ede0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
1edf0 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
1ee00 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
1ee10 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1ee20 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
1ee30 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
1ee40 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
1ee50 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
1ee60 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
1ee70 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
1ee80 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
1ee90 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
1eea0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
1eeb0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
1eec0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
1eed0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
1eee0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1eef0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1ef00 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
1ef10 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
1ef20 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
1ef30 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
1ef40 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
1ef50 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
1ef60 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
1ef70 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
1ef80 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
1ef90 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
1efa0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
1efb0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
1efc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1efd0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
1efe0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
1eff0 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
1f000 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
1f010 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
1f020 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
1f030 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
1f040 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
1f050 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
1f060 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
1f070 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
1f080 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
1f090 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
1f0a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1f0b0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
1f0c0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
1f0d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
1f0e0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
1f0f0 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
1f100 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
1f110 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
1f120 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
1f130 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
1f140 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
1f150 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
1f160 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1f170 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
1f180 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
1f190 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1f1a0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
1f1b0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
1f1c0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
1f1d0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
1f1e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f1f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f200 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
1f210 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
1f220 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1f230 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f240 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
1f250 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
1f260 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
1f270 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1f280 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
1f290 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
1f2a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f2b0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1f2c0 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
1f2d0 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
1f2e0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1f2f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f300 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1f310 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1f320 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1f330 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f340 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f350 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1f360 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
1f370 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1f380 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
1f390 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
1f3a0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
1f3b0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1f3c0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
1f3d0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
1f3e0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
1f3f0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
1f400 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
1f410 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
1f420 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
1f430 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
1f440 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
1f450 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1f460 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
1f470 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
1f480 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
1f490 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
1f4a0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
1f4b0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
1f4c0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
1f4d0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
1f4e0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
1f4f0 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
1f500 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
1f510 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
1f520 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
1f530 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
1f540 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
1f550 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
1f560 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1f570 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
1f580 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
1f590 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1f5a0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
1f5b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1f5c0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1f5d0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1f5e0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f5f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1f600 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1f610 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1f620 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1f630 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
1f640 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
1f650 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1f660 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f670 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1f680 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1f690 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1f6a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1f6c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1f6d0 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1f6e0 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
1f6f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
1f700 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1f710 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1f720 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
1f730 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1f740 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
1f750 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
1f760 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
1f770 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
1f780 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1f790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1f7a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f7b0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1f7c0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1f7d0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1f7e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1f7f0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1f800 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1f810 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1f820 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1f830 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1f840 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
1f850 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1f860 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1f870 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
1f880 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
1f890 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
1f8a0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1f8b0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
1f8c0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
1f8d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1f8e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f8f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f900 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f910 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1f920 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63  le was just succ
1f930 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
1f940 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53   Set Pager.needS
1f950 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a  ync .    ** to z
1f960 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ero and clear th
1f970 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
1f980 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61  C flag on all pa
1f990 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gess..    */.   
1f9a0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1f9b0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1f9c0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1f9d0 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  d = 1;.    pPage
1f9e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1f9f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fa00 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ff;.    sqlite3P
1fa10 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
1fa20 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
1fa30 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  che);.  }..  ret
1fa40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fa50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
1fa60 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1fa70 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
1fa80 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1fa90 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
1faa0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
1fab0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
1fac0 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
1fad0 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
1fae0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
1faf0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
1fb00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1fb10 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
1fb20 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
1fb30 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
1fb40 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
1fb50 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
1fb60 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
1fb70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
1fb80 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
1fb90 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
1fba0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
1fbb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1fbc0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
1fbd0 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
1fbe0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1fbf0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
1fc00 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
1fc10 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
1fc20 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
1fc30 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
1fc40 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
1fc50 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1fc60 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
1fc70 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
1fc80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fc90 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
1fca0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
1fcb0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
1fcc0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
1fcd0 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
1fce0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
1fcf0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1fd00 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
1fd10 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
1fd20 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
1fd30 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
1fd40 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
1fd50 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
1fd60 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
1fd70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
1fd80 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
1fd90 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1fda0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
1fdb0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
1fdc0 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
1fdd0 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
1fde0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
1fdf0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
1fe00 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
1fe10 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
1fe20 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
1fe30 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
1fe40 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
1fe50 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
1fe60 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
1fe70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
1fe80 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
1fe90 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
1fea0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
1feb0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
1fec0 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
1fed0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
1fee0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
1fef0 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
1ff00 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
1ff10 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
1ff20 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
1ff30 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
1ff40 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1ff50 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1ff60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1ff70 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
1ff80 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
1ff90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1ffa0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1ffb0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
1ffc0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1ffd0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
1ffe0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
1fff0 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
20000 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
20010 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
20020 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20030 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
20040 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
20050 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
20060 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20080 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
20090 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
200c0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
200d0 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29 20  NEVER(pList==0) 
200e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
200f0 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
20100 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
20110 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
20120 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
20130 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
20140 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
20150 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
20160 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
20170 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
20180 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
20190 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
201a0 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20  ng.  ** call is 
201b0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20  a no-op..  **.  
201c0 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
201d0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
201e0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
201f0 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
20200 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
20210 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
20220 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
20230 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
20240 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
20250 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
20260 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
20270 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
20280 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
20290 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
202a0 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
202b0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
202c0 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
202d0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
202e0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
202f0 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
20300 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
20310 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
20320 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
20330 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
20340 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
20350 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
20360 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
20370 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
20380 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
20390 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
203a0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
203b0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
203c0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
203d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
203e0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
203f0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
20400 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
20410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20420 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
20430 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
20440 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
20450 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
20460 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
20470 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
20480 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61 67  eWal(pList->pPag
20490 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
204a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
204b0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
204c0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
204d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
204e0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
204f0 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  CK);..  /* If th
20500 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
20510 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
20520 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
20530 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
20540 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
20550 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
20560 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
20570 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
20580 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
20590 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
205a0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
205b0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
205c0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
205d0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
205e0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
205f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
20600 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
20610 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
20620 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
20630 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
20640 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
20650 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
20660 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
20670 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
20680 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
20690 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
206a0 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
206b0 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 69  ill be..  */.  i
206c0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
206d0 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64 62 4f  e > (pPager->dbO
206e0 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20 69 73  rigSize+1) && is
206f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
20700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
20710 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
20720 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
20730 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
20740 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
20750 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
20760 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
20770 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
20780 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
20790 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20 77  zFile);.  }..  w
207a0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
207b0 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
207c0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
207d0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
207e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
207f0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
20800 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
20810 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
20820 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
20830 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
20840 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
20850 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
20860 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
20870 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
20880 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
20890 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
208a0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
208b0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
208c0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
208d0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
208e0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
208f0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
20900 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
20910 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
20920 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
20930 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
20940 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
20950 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
20960 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
20970 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
20980 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
20990 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
209a0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
209b0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
209c0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
209d0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
209e0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
209f0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
20a00 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
20a40 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
20a50 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
20a60 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
20a70 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
20a80 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
20a90 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
20aa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
20ab0 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
20ac0 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
20ad0 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
20ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
20af0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
20b00 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
20b10 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
20b20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
20b30 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
20b40 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
20b50 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
20b60 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
20b70 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
20b80 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
20b90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
20ba0 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
20bb0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
20bc0 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
20bd0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
20be0 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
20bf0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
20c00 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
20c10 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
20c20 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
20c30 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
20c40 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
20c50 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
20c60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20c70 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
20c80 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
20c90 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
20ca0 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
20cb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20cc0 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
20cd0 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
20ce0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
20cf0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
20d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
20d10 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
20d20 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
20d30 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
20d40 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
20d50 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
20d60 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
20d70 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
20d90 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
20da0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
20db0 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
20dc0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
20dd0 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
20de0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
20df0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
20e00 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
20e10 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
20e20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
20e30 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
20e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
20e50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
20e60 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
20e70 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20e80 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
20e90 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
20ea0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
20eb0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
20ec0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
20ed0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
20ee0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
20ef0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
20f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20f10 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
20f20 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
20f30 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
20f40 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
20f50 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
20f60 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
20f70 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
20f80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20f90 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
20fa0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
20fb0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
20fc0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
20fd0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
20fe0 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
20ff0 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
21000 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
21010 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
21020 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
21030 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
21040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21050 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
21060 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
21070 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
21080 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
21090 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
210a0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
210b0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
210c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
210d0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
210e0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
210f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
21100 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
21110 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
21120 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
21130 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
21140 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21150 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
21160 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
21170 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
21180 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
21190 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
211a0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
211b0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
211c0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
211d0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
211e0 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
211f0 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
21200 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
21210 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
21220 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
21230 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
21240 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
21250 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
21260 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
21270 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
21280 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
21290 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
212a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
212b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
212c0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
212d0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
212e0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
212f0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
21300 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
21310 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
21320 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
21330 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
21340 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
21350 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
21360 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
21370 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
21380 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
21390 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
213a0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
213b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
213c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
213d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
213e0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
213f0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
21400 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
21410 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
21420 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
21430 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
21440 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
21450 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21460 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
21470 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
21480 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21490 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
214a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
214b0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
214c0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
214d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
214e0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
214f0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
21500 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
21510 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
21520 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
21530 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
21540 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
21550 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
21560 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
21570 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
21580 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
21590 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
215a0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
215b0 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
215c0 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
215d0 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
215e0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
215f0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
21600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21610 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
21620 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
21630 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
21640 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
21650 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
21660 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21670 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
21680 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
21690 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
216a0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
216b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
216c0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
216d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
216e0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
216f0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
21700 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
21710 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
21720 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
21730 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
21740 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
21750 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21780 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
21790 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
217a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
217b0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
217c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
217d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
217e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
217f0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
21800 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21810 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
21820 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
21830 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
21840 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
21850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21860 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21870 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
21880 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
21890 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
218a0 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
218b0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
218c0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
218d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
218e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
218f0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
21900 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
21910 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
21920 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
21930 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
21940 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
21950 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
21960 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
21970 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
21980 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
21990 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
219a0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
219b0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
219c0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
219d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
219e0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
219f0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
21a00 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
21a10 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
21a20 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
21a30 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
21a40 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
21a50 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
21a60 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
21a70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
21a80 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
21a90 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
21aa0 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
21ab0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
21ac0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
21ad0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
21ae0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
21af0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
21b00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
21b10 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
21b20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21b30 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
21b40 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
21b50 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
21b60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
21b70 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
21b80 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
21b90 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
21ba0 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
21bb0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
21bc0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
21bd0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
21be0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
21bf0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
21c00 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
21c10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
21c20 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
21c30 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
21c40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
21c50 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
21c60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21c70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
21c80 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
21c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21ca0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
21cb0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
21cc0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
21cd0 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
21ce0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
21cf0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
21d00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
21d10 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
21d20 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
21d30 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
21d40 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
21d50 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
21d60 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
21d70 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
21d80 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
21d90 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
21da0 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
21db0 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
21dc0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
21dd0 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
21de0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
21df0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
21e00 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
21e10 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
21e20 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
21e30 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
21e40 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
21e50 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
21e60 20 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e 20   inhibited when 
21e70 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
21e80 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
21e90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
21ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21eb0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21ec0 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74  doNotSpill ) ret
21ed0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21ee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
21ef0 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28  otSyncSpill && (
21f00 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
21f10 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
21f20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21f30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
21f40 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
21f50 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
21f60 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21f70 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
21f80 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
21f90 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
21fa0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  log. */.    if( 
21fb0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
21fc0 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20  (pPg) ){ .      
21fd0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
21fe0 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d  age(pPg); .    }
21ff0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22010 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
22020 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
22030 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
22040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
22050 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
22060 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
22070 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
22080 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
22090 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
220a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
220b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
220c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
220d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
220e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
220f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 0a 20 20 20  QLITE_OK && .   
22100 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
22110 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
22120 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
22130 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20  MORY) &&.       
22140 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
22150 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
22160 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
22170 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
22180 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b  APPEND).      ){
22190 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
221a0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
221b0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
221c0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
221d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
221e0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
221f0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
22200 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
22210 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
22220 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  ent size of.    
22230 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
22240 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
22250 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
22260 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
22270 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  nal..    ** This
22280 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
22290 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
222a0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
222b0 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
222c0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
222d0 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
222e0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
222f0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
22300 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   Consider the fo
22310 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65  llowing sequence
22320 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20   of events:.    
22330 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49  **.    **   BEGI
22340 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a  N;.    **     <j
22350 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
22360 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66     **     <modif
22370 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  y page X>.    **
22380 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
22390 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  p;.    **       
223a0 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
223b0 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
223c0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70  >.    **       p
223d0 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20  agerStress(page 
223e0 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f  X).    **     RO
223f0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20  LLBACK TO sp;.  
22400 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28    **.    ** If (
22410 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20  X>Y), then when 
22420 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63  pagerStress is c
22430 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c  alled page X wil
22440 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
22450 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  .    ** out to t
22460 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22470 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
22480 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
22490 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20  ache. Then,.    
224a0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
224b0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
224c0 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
224d0 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
224e0 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74   read.    ** dat
224f0 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
22500 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
22510 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
22520 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
22530 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20      ** was when 
22540 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22550 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
22560 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
22570 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a  EPOINT sp".    *
22580 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a  * was executed..
22590 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
225a0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
225b0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
225c0 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
225d0 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20   X into the .   
225e0 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
225f0 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20  file now (if it 
22600 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74  is not already t
22610 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69  here), so that i
22620 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
22630 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
22640 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
22650 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
22660 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20  K TO sp" is .   
22670 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
22680 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56    */.    if( NEV
22690 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  ER(.        rc==
226a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
226b0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
226c0 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
226d0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
226e0 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63     ) ){.      rc
226f0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
22700 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
22710 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
22720 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22730 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
22740 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22750 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
22760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22770 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
22780 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
22790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
227a0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
227b0 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
227c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
227d0 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
227e0 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
227f0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
22800 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
22810 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
22820 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
22830 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
22840 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
22850 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
22860 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
22870 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
22880 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
22890 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
228a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
228b0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
228c0 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
228d0 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
228e0 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
228f0 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
22900 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
22910 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
22920 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
22930 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
22940 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
22950 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
22960 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
22970 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
22980 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
22990 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
229a0 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
229b0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
229c0 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
229d0 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
229e0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
229f0 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
22a00 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
22a10 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
22a20 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
22a30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
22a40 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
22a50 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
22a60 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
22a70 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
22a80 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
22a90 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
22aa0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
22ab0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
22ac0 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
22ad0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
22ae0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
22af0 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
22b00 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
22b10 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
22b20 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
22b30 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
22b40 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
22b50 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a  tExtra() API..**
22b60 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
22b70 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
22b80 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
22b90 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
22ba0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
22bb0 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
22bc0 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
22bd0 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
22be0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
22bf0 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49  of the PAGER_OMI
22c00 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41  T_JOURNAL and PA
22c10 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20  GER_NO_READLOCK 
22c20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
22c30 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
22c40 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
22c50 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
22c60 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
22c70 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
22c80 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
22c90 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
22ca0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
22cb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
22cc0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
22cd0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
22ce0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
22cf0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
22d00 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
22d10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
22d20 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
22d30 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
22d40 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
22d50 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
22d60 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
22d70 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
22d80 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
22d90 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
22da0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
22db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22dc0 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
22dd0 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
22de0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
22df0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
22e00 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
22e10 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
22e20 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
22e30 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
22e40 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
22e50 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
22e60 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
22e70 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
22e80 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
22e90 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
22ea0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
22eb0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
22ec0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
22ed0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
22ee0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
22ef0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22f00 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
22f10 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
22f20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
22f30 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
22f40 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
22f50 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
22f60 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
22f70 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
22f80 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
22f90 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
22fa0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
22fb0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
22fc0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
22fd0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
22fe0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
22ff0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
23000 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
23010 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
23020 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
23030 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
23040 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
23050 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
23060 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
23070 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
23080 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
23090 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
230a0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
230b0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
230c0 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
230d0 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
230e0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
230f0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
23100 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23110 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
23120 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
23130 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
23140 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
23150 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
23160 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
23170 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
23180 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
23190 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
231a0 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
231b0 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
231c0 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
231d0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
231e0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
231f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
23200 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
23210 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
23220 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
23230 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
23240 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
23250 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
23260 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
23270 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
23280 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64   */.  int noRead
23290 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
232a0 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
232b0 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  K)!=0;  /* True 
232c0 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63  to omit read-loc
232d0 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  k */.  int pcach
232e0 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
232f0 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
23300 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
23310 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
23320 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61  he */.  u16 szPa
23330 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
23340 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
23350 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
23360 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f  age size */..  /
23370 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
23380 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
23390 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
233a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
233b0 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
233c0 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
233d0 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
233e0 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
233f0 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20  ournal). This.  
23400 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ** is the maximu
23410 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
23420 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
23430 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  y journal file h
23440 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20  andle .  ** and 
23450 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  a regular journa
23460 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e  l file-handle. N
23470 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75  ote that a "regu
23480 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64  lar journal-hand
23490 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  le".  ** may be 
234a0 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c  a wrapper capabl
234b0 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65  e of caching the
234c0 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f   first portion o
234d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
234e0 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72  ** file in memor
234f0 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
23500 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
23510 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65  optimization (se
23520 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  e .  ** source f
23530 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a  ile journal.c)..
23540 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
23550 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
23560 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
23570 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
23580 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
23590 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
235a0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
235b0 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Vfs));.  }else{.
235c0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
235d0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
235e0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
235f0 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ze());.  }..  /*
23600 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
23610 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
23620 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
23630 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
23640 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
23650 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
23660 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
23670 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
23680 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
23690 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
236a0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
236b0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
236c0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
236d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
236e0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
236f0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
23700 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
23710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
23720 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
23730 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
23740 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
23750 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
23760 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
23770 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68  ite3Malloc(nPath
23780 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
23790 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
237a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
237b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
237c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
237d0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
237e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
237f0 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
23800 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
23810 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
23820 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
23830 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  0;.    }else.#en
23840 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
23850 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
23860 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
23870 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
23880 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
23890 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20  ) fails */.     
238a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
238b0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
238c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
238d0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
238e0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  e);.    }..    n
238f0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
23900 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
23910 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
23920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23930 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
23940 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
23950 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
23960 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
23970 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
23980 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
23990 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
239a0 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
239b0 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
239c0 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
239d0 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
239e0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
239f0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
23a00 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
23a10 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
23a20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
23a30 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
23a40 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
23a50 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
23a60 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
23a70 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
23a80 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
23a90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
23aa0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
23ab0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
23ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
23ae0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
23af0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
23b00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
23b10 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
23b20 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
23b30 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
23b40 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
23b50 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
23b60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
23b70 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
23b80 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
23b90 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
23ba0 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
23bb0 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
23bc0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
23bd0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
23be0 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
23c00 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
23c10 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
23c20 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
23c30 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
23c40 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
23c50 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
23c60 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
23c70 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
23c80 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
23c90 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
23ca0 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
23cb0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
23cc0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
23cd0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23ce0 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
23cf0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
23d00 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
23d10 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
23d20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
23d30 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
23d40 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
23d50 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
23d60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23d80 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
23d90 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
23da0 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
23db0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
23dc0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
23dd0 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
23de0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
23df0 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
23e00 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
23e10 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
23e20 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
23e30 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
23e40 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
23e50 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
23e60 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
23e70 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
23e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23e90 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
23ea0 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
23eb0 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
23ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
23ed0 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
23ee0 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20  thname + 8 + 1  
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
23f00 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
23f10 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
23f20 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
23f30 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
23f40 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
23f50 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
23f60 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
23f70 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
23f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23f90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
23fa0 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
23fb0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
23fc0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
23fd0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
23fe0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
23ff0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
24000 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
24010 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
24020 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
24030 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
24040 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
24050 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
24060 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
24070 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
24080 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
24090 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
240a0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
240b0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
240c0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
240d0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
240e0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
240f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
24100 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
24110 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
24120 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
24130 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
24140 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
24150 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
24160 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
24170 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
24180 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
24190 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
241a0 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
241b0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
241c0 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
241d0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
241e0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
241f0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
24200 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
24210 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
24220 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
24230 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
24240 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
24250 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
24260 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69  rnal", 8);.    i
24270 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  f( pPager->zFile
24280 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61  name[0]==0 ) pPa
24290 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d  ger->zJournal[0]
242a0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
242b0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
242c0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
242d0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
242e0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
242f0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
24300 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
24310 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
24320 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
24330 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20  zFilename[0] && 
24340 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e  !memDb ){.    in
24350 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24370 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
24380 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
24390 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
243a0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
243b0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
243c0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
243d0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
243e0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
243f0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
24400 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
24410 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
24420 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
24430 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
24440 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
24450 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
24460 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
24470 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
24480 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
24490 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
244a0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
244b0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
244c0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
244d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
244e0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
244f0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
24500 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
24510 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
24520 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
24530 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
24540 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
24550 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
24560 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
24570 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
24580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24590 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
245a0 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  ){.      setSect
245b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
245c0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
245d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
245e0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
245f0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
24600 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
24610 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
24620 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
24630 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
24640 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
24650 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
24660 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
24670 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
24680 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
24690 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
246a0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  IZE;.        }el
246b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
246c0 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29  PageDflt = (u16)
246d0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
246e0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
246f0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
24700 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
24710 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a  C_WRITE.      {.
24720 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
24730 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
24740 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
24750 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
24760 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
24770 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
24780 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
24790 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
247a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
247b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
247c0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
247d0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
247e0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
247f0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
24800 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
24810 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
24820 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
24830 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
24840 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
24850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
24860 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
24870 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
24880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
24890 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
248a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
248b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
248c0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ndif.    }.  }el
248d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
248e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
248f0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
24900 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
24910 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
24920 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
24930 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
24940 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
24950 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
24960 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
24970 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
24980 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
24990 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
249a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
249b0 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
249c0 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
249d0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
249e0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
249f0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
24a00 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
24a10 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
24a20 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
24a30 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
24a40 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
24a50 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
24a60 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20  urnal..    */ . 
24a70 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
24a80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
24a90 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
24aa0 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e  SIVE;.    readOn
24ab0 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
24ac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
24ad0 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
24ae0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
24af0 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
24b00 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
24b10 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
24b20 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
24b30 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
24b40 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
24b50 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
24b60 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
24b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24b90 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
24ba0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24bb0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
24bc0 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
24bd0 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
24be0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
24bf0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
24c00 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
24c10 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74   occurred in eit
24c20 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
24c30 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
24c40 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
24c50 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
24c60 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
24c70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
24c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
24c90 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
24ca0 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
24cb0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
24cc0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
24cd0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
24ce0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
24cf0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
24d00 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
24d10 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
24d20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
24d30 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20  000 );.  nExtra 
24d40 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
24d50 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
24d60 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
24d70 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
24d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24d90 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
24da0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
24db0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
24dc0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
24dd0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
24de0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
24df0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
24e00 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
24e10 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
24e20 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
24e30 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
24e40 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
24e50 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
24e60 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
24e70 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
24e80 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
24e90 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
24ea0 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
24eb0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
24ec0 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
24ed0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
24ee0 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
24ef0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
24f00 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
24f10 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
24f20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
24f30 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
24f40 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
24f50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
24f60 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
24f70 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
24f80 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
24f90 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
24fa0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
24fb0 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
24fc0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
24fd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
24fe0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
24ff0 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
25000 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
25010 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
25020 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
25030 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
25040 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
25050 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
25060 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
25070 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
25080 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
25090 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
250a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
250b0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
250c0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
250d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
250e0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
250f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
25100 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
25110 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
25120 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
25130 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
25140 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
25150 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
25160 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
25170 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
25180 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
25190 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
251a0 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  /.  assert( useJ
251b0 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
251c0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
251d0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
251e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
251f0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
25200 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  lSync = pPager->
25210 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70  noSync ?0:1;.  p
25220 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
25230 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
25240 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
25250 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
25260 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
25270 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
25280 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
25290 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
252a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
252b0 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
252c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
252d0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
252e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
252f0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
25300 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
25310 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
25320 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
25330 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
25340 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
25350 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
25360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
25370 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
25380 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
25390 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
253a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
253b0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
253c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
253d0 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
253e0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
253f0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
25400 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
25410 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
25420 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
25430 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
25440 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
25450 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
25460 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
25470 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
25480 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
25490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
254a0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
254b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
254c0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
254d0 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
254e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
254f0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
25500 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
25510 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
25520 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
25530 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
25540 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
25550 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
25560 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
25570 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
25580 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
25590 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
255a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
255b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
255c0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
255d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
255e0 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
255f0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
25600 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
25610 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
25620 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
25630 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
25640 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
25650 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
25660 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
25670 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
25680 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
25690 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
256a0 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
256b0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
256c0 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
256d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
256e0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
256f0 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
25700 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
25710 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
25720 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
25730 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
25740 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
25750 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
25760 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
25770 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
25780 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
25790 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
257a0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
257b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
257c0 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
257d0 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
257e0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
257f0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
25800 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
25810 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
25820 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
25830 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
25840 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
25850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
25860 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
25870 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
25880 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
25890 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
258a0 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
258b0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
258c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
258d0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
258e0 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
258f0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
25900 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
25910 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
25920 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
25930 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
25940 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
25950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25960 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
25970 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
25980 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
25990 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
259a0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
259b0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
259c0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
259d0 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
259e0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
259f0 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
25a00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
25a10 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
25a20 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
25a30 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25a40 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
25a50 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
25a60 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
25a70 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
25a80 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
25a90 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
25aa0 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
25ab0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
25ac0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
25ad0 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
25ae0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
25af0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
25b00 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25b10 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
25b20 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
25b30 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
25b40 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
25b50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25b60 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
25b70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25b80 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
25b90 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
25ba0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
25bb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25bc0 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
25bd0 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
25be0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25bf0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
25c00 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
25c10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
25c20 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
25c30 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
25c40 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
25c50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
25c60 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52  te <= PAGER_SHAR
25c70 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
25c80 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28  jrnlOpen==0 || (
25c90 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
25ca0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
25cb0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20  pPager->jfd) &. 
25cc0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
25cd0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
25ce0 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a  _OPEN.  ));..  *
25cf0 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69  pExists = 0;.  i
25d00 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
25d10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25d20 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
25d30 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
25d40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
25d50 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
25d60 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
25d70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
25d80 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f  ts ){.    int lo
25d90 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  cked;           
25da0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25db0 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f   some process ho
25dc0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
25dd0 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ock */..    /* R
25de0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65  ace condition he
25df0 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f  re:  Another pro
25e00 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20  cess might have 
25e10 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65  been holding the
25e20 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45  .    ** the RESE
25e30 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61  RVED lock and ha
25e40 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65  ve a journal ope
25e50 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  n at the sqlite3
25e60 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20  OsAccess() .    
25e70 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62  ** call above, b
25e80 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ut then delete t
25e90 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64  he journal and d
25ea0 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66  rop the lock bef
25eb0 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65  ore.    ** we ge
25ec0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
25ed0 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  ng sqlite3OsChec
25ee0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20  kReservedLock() 
25ef0 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20  call.  If that. 
25f00 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73     ** is the cas
25f10 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
25f20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72  might think ther
25f30 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
25f40 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69  al when.    ** i
25f50 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20  n fact there is 
25f60 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75  none.  This resu
25f70 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70  lts in a false-p
25f80 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69  ositive which wi
25f90 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  ll.    ** be dea
25fa0 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70  lt with by the p
25fb0 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  layback routine.
25fc0 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a    Ticket #3883..
25fd0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
25fe0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
25ff0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
26000 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
26010 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26020 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65  ITE_OK && !locke
26030 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
26040 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Page;..      /* 
26050 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
26060 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
26070 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
26080 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
26090 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
260a0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
260b0 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
260c0 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
260d0 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
260e0 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
260f0 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
26100 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
26110 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
26120 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
26130 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
26140 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
26150 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
26160 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
26170 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
26180 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
26190 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
261a0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
261b0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
261c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
261d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
261e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
261f0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
26200 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
26210 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
26220 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
26230 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
26240 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
26250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
26260 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
26270 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
26280 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
26290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
262a0 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
262b0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
262c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
262d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
262e0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
262f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26310 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
26320 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
26330 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
26340 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
26350 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
26360 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
26370 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
26380 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
26390 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
263a0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
263b0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
263c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
263d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
263e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
263f0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
26400 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
26410 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
26420 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
26430 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
26440 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
26450 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26460 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
26470 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
26480 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
26490 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
264a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
264b0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
264c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
264d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
264e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
264f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
26500 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
26510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26530 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
26540 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
26550 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26560 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
26570 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
26580 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
26590 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
265a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
265b0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
265c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
265d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
265e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
265f0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
26600 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
26610 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
26620 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
26630 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26640 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
26650 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
26660 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
26670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26680 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
26690 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
266a0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
266b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
266c0 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
266d0 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
266e0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73        ** its has
266f0 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
26700 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
26710 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
26720 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
26730 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
26740 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
26750 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
26760 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
26770 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
26780 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
26790 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
267a0 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
267b0 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
267c0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
267d0 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
267e0 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
267f0 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
26800 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
26810 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
26820 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
26830 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
26840 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
26850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
26860 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
26870 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
26880 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
26890 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
268a0 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
268b0 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
268c0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
268d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
268e0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
268f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
26900 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26920 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
26930 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
26940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
26950 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26960 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
26970 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
26980 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26990 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
269a0 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
269b0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
269c0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
269d0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
269e0 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
269f0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
26a00 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
26a10 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
26a20 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
26a30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
26a40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
26a50 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
26a60 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
26a70 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
26a80 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
26a90 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
26aa0 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
26ab0 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55  ently in PAGER_U
26ac0 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20  NLOCK state (no 
26ad0 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20  lock held.**    
26ae0 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
26af0 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e  e file), then an
26b00 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
26b10 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20   to obtain a.** 
26b20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b       SHARED lock
26b30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26b40 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65   file. Immediate
26b50 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
26b60 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53  ng.**      the S
26b70 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
26b80 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63  file-system is c
26b90 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74  hecked for a hot
26ba0 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20  -journal,.**    
26bb0 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65    which is playe
26bc0 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e  d back if presen
26bd0 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79  t. Following any
26be0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   hot-journal .**
26bf0 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20        rollback, 
26c00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
26c10 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61  the cache are va
26c20 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b  lidated by check
26c30 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
26c40 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27  'change-counter'
26c50 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61   field of the da
26c60 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
26c70 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64  er and.**      d
26c80 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79  iscarded if they
26c90 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65   are found to be
26ca0 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20   invalid..**.** 
26cb0 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65    2) If the page
26cc0 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
26cd0 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20  exclusive-mode, 
26ce0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75  and there are cu
26cf0 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
26d00 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
26d10 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79  eferences to any
26d20 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69   pages, and is i
26d30 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
26d40 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20  e,.**      then 
26d50 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
26d60 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  de to clear the 
26d70 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64  error state by d
26d80 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20  iscarding.**    
26d90 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
26da0 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
26db0 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63   and rolling bac
26dc0 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e  k any open journ
26dd0 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e  al.**      file.
26de0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
26df0 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  eration describe
26e00 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20 69  d by (2) above i
26e10 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
26e20 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70   and if the.** p
26e30 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
26e40 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
26e50 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
26e60 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
26e70 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  lled,.** the err
26e80 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
26e90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
26ea0 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65 64   It is permitted
26eb0 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20   to read the.** 
26ec0 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e  database when in
26ed0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72   SQLITE_FULL err
26ee0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
26ef0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76  Otherwise, if ev
26f00 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
26f10 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
26f20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
26f30 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72  f an.** IO error
26f40 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
26f50 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
26f60 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
26f70 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
26f80 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e  * file or rollin
26f90 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
26fa0 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
26fb0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
26fc0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
26fd0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
26fe0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
26ff0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
27000 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27010 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27020 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
27030 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
27040 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
27050 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f 76  /* True if recov
27060 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72  ering from error
27070 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20   state */..  /* 
27080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27090 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
270a0 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
270b0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
270c0 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
270d0 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 61  ing pages */.  a
270e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
270f0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
27100 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
27110 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
27120 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
27130 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
27140 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
27150 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ode; }..  /* If 
27160 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
27170 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61   in an error-sta
27180 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68 61  te, now is a cha
27190 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a  nce to clear.  *
271a0 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73  * the error. Dis
271b0 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
271c0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
271d0 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63  ache and rollbac
271e0 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20 6a  k.  ** any hot j
271f0 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69  ournal in the fi
27200 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  le-system..  */.
27210 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
27220 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
27230 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27240 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
27250 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  zJournal ){.    
27260 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d    isErrorReset =
27270 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
27280 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
27290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
272a0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
272b0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
272c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
272d0 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  r) ){.    rc = p
272e0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
272f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
27300 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
27310 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
27320 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45  ER_UNLOCK || isE
27330 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20  rrorReset ){.   
27340 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
27350 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
27360 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  er->pVfs;.    in
27370 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  t isHotJournal =
27380 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
27390 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
273a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
273b0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
273c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
273d0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
273e0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
273f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27400 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
27410 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
27420 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
27430 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  HARED;.    }else
27440 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
27450 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
27460 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
27470 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
27480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
274a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
274b0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
274c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
274d0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
274e0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
274f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
27500 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
27510 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
27520 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
27530 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
27540 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
27550 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
27560 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
27570 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
27580 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
27590 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
275a0 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
275b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
275c0 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
275d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
275e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50  ager->state <= P
275f0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
27600 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
27610 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
27620 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a  &isHotJournal);.
27630 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27650 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
27660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27670 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73    if( isErrorRes
27680 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e  et || isHotJourn
27690 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  al ){.      /* G
276a0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
276b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
276c0 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
276d0 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
276e0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
276f0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
27700 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
27710 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
27720 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
27730 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
27740 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
27750 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
27760 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
27770 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
27780 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
27790 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
277a0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
277b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
277c0 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
277d0 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
277e0 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
277f0 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
27800 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
27810 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
27820 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
27830 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
27840 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
27850 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
27860 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
27870 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
27880 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
27890 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
278a0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
278b0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
278c0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
278d0 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
278e0 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
278f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
27900 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
27910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
27920 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27930 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
27940 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  <EXCLUSIVE_LOCK 
27950 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27960 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
27970 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
27980 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
27990 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
279a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
279b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
279c0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
279d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
279e0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
279f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
27a00 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
27a10 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
27a20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65  }. .      /* Ope
27a30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
27a40 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
27a50 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ess. This is bec
27a60 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a  ause in .      *
27a70 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
27a80 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
27a90 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
27aa0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
27ab0 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69  d.      ** possi
27ac0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
27ad0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
27ae0 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73   on. On some sys
27af0 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20  tems, the.      
27b00 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
27b10 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
27b20 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
27b30 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
27b40 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64  .      ** a read
27b50 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64  /write file hand
27b60 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
27b70 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
27b80 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
27b90 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
27ba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27bb0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
27bc0 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s,pPager->zJourn
27bd0 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53  al,SQLITE_ACCESS
27be0 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20  _EXISTS,&res);. 
27bf0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
27c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27c10 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
27c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
27c30 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
27c40 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
27c50 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
27c60 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
27c70 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
27c80 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
27c90 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
27ca0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
27cb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27cc0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
27cd0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
27ce0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
27cf0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
27d00 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
27d10 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
27d20 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27d50 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
27d60 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
27d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
27d80 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
27d90 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
27da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
27db0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
27dc0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
27dd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
27de0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
27df0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
27e00 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
27e10 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
27e20 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
27e30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68            ** oth
27e40 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
27e50 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
27e60 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
27e70 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 20   before .       
27e80 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
27e90 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
27ea0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
27eb0 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
27ec0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t .            *
27ed0 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
27ee0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
27ef0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
27f00 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
27f10 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
27f20 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
27f30 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
27f40 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
27f50 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t.  */.         
27f60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
27f70 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
27f80 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
27f90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27fb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27fc0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
27fd0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
27fe0 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20  .      /* Reset 
27ff0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74 61 74  the journal stat
28000 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69 6e 64  us fields to ind
28010 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 68  icates that we h
28020 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20  ave no.      ** 
28030 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
28040 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 2a   at this time. *
28050 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
28060 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
28070 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
28080 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
28090 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
280a0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
280b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
280c0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
280d0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
280e0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
280f0 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
28100 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  ed to disk. */. 
28110 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
28120 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
28130 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
28140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
28150 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
28160 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
28170 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
28180 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
28190 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
281a0 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
281b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
281c0 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
281d0 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
281e0 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
281f0 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
28200 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
28210 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
28220 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
28230 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
28240 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
28250 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
28260 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
28270 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
28280 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
28290 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
282a0 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
282b0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
282c0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
282d0 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
282e0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
282f0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28300 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28310 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
28320 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
28330 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28350 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
28360 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
28370 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
28380 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
283a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
283b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
283c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
283d0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
283e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
283f0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
28400 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
28410 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
28420 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
28430 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
28440 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41  pPager->state>PA
28450 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
28460 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
28470 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
28480 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63  kup || sqlite3Pc
28490 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
284a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
284b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
284c0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
284d0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
284e0 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
284f0 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
28500 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
28510 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
28520 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
28530 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
28540 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
28550 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
28560 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
28570 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
28580 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
28590 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
285a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
285b0 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
285c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
285d0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
285e0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
285f0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
28600 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
28610 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
28620 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
28630 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
28640 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
28650 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
28660 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
28670 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
28680 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
28690 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
286a0 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
286b0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
286c0 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
286d0 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
286e0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
286f0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
28700 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
28710 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
28720 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
28730 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
28740 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
28750 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
28760 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
28770 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
28780 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
28790 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
287a0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
287b0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
287c0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
287d0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30     int nPage = 0
287e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
287f0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
28800 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
28810 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
28820 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
28830 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
28840 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
28850 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
28860 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
28870 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
28880 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28890 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
288a0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
288b0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
288c0 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
288d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
288e0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
288f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28900 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
28910 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
28920 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
28930 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
28940 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28960 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28970 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
28980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28990 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
289a0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
289b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
289c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
289d0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
289e0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
289f0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
28a00 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
28a10 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
28a20 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
28a30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28a40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28a50 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
28a60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
28a70 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
28a80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
28a90 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
28aa0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
28ab0 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
28ac0 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
28ad0 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
28ae0 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
28af0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
28b00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
28b10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
28b20 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
28b30 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
28b40 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
28b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28b60 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
28b70 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
28b80 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
28b90 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
28ba0 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
28bb0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
28bc0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28be0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
28bf0 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
28c00 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
28c10 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
28c20 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
28c30 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
28c40 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
28c50 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
28c60 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
28c70 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
28c80 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
28c90 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
28ca0 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
28cb0 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
28cc0 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
28cd0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
28ce0 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
28cf0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
28d00 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
28d10 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
28d20 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
28d30 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
28d40 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
28d50 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
28d60 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70  e)==0).   && (!p
28d70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
28d80 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
28d90 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
28da0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
28db0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
28dc0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
28dd0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
28de0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
28df0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
28e00 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
28e10 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
28e20 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
28e30 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
28e40 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
28e50 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
28e60 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
28e70 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
28e80 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
28e90 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
28ea0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
28eb0 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
28ec0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
28ed0 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
28ee0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
28ef0 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
28f00 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
28f10 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
28f20 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
28f30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28f40 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
28f50 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
28f60 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
28f70 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
28f80 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
28f90 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
28fa0 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
28fb0 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
28fc0 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
28fd0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
28fe0 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
28ff0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
29000 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
29010 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
29020 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
29030 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
29040 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
29050 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
29060 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
29070 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
29080 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
29090 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
290a0 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
290b0 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
290c0 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
290d0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
290e0 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
290f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
29100 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
29110 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
29120 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
29130 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
29140 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
29150 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
29160 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
29170 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
29180 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
29190 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
291a0 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
291b0 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
291c0 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
291d0 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
291e0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
291f0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
29200 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
29210 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
29220 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
29230 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
29240 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
29250 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
29260 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
29270 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
29280 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
29290 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
292a0 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
292b0 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
292c0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
292d0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
292e0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
292f0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
29300 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
29310 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
29320 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
29330 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
29340 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
29350 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
29360 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
29370 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
29380 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
29390 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
293a0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
293b0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
293c0 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
293d0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
293e0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
293f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
29400 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
29410 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
29420 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
29430 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
29440 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
29450 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
29460 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
29470 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
29480 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
29490 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
294a0 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
294b0 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
294c0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
294d0 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
294e0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
294f0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
29500 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
29510 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
29520 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29530 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
29540 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
29550 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
29560 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
29570 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
29580 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
29590 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
295a0 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
295b0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
295c0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
295d0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
295e0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
295f0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
29600 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
29610 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
29620 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
29630 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
29640 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
29650 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
29660 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
29670 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
29680 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
29690 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
296a0 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
296b0 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
296c0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
296d0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
296e0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
296f0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
29700 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
29710 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
29720 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
29730 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
29740 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
29750 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
29760 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
29770 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
29780 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
29790 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
297a0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
297b0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
297c0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
297d0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
297e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
297f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
29800 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
29810 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
29820 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
29830 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
29840 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
29850 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
29860 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
29870 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
29880 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
29890 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
298a0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
298b0 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
298c0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
298d0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
298e0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
298f0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
29900 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
29910 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
29920 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29930 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f  state>PAGER_UNLO
29940 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  CK );..  if( pgn
29950 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
29960 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29970 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
29980 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
29990 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
299a0 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
299b0 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
299c0 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
299d0 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
299e0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
299f0 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
29a00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
29a10 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
29a20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
29a30 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
29a40 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
29a50 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
29a60 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
29a70 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
29a80 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
29a90 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
29aa0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
29ab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29ac0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
29ad0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
29ae0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
29af0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
29b00 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
29b10 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
29b20 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
29b30 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
29b40 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
29b50 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
29b60 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
29b70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
29b80 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
29b90 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
29ba0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
29bb0 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
29bc0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
29bd0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
29be0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
29bf0 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
29c00 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
29c10 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
29c20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
29c30 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
29c40 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
29c50 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
29c60 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
29c70 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
29c80 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
29c90 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
29ca0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
29cb0 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
29cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
29cd0 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
29ce0 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
29cf0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
29d00 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
29d10 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
29d20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29d30 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
29d40 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
29d50 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
29d60 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
29d70 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
29d80 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
29d90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
29da0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a  .    int nMax;..
29db0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
29dc0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
29dd0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
29de0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
29df0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
29e00 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
29e10 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
29e20 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
29e30 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
29e40 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
29e50 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
29e60 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
29e70 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
29e80 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
29e90 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
29ea0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
29eb0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
29ec0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
29ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29ee0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29ef0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
29f00 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
29f10 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
29f20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29f30 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
29f40 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
29f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f60 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
29f70 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
29f80 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
29f90 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67   || nMax<(int)pg
29fa0 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
29fb0 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
29fc0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
29fd0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
29fe0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
29ff0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
2a000 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
2a010 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
2a020 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
2a030 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
2a040 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
2a050 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
2a060 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
2a070 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
2a080 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
2a090 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
2a0a0 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
2a0b0 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
2a0c0 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
2a0d0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
2a0e0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
2a0f0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a100 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
2a110 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
2a120 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
2a130 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
2a140 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
2a150 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2a160 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
2a170 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
2a180 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
2a190 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
2a1a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
2a1b0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
2a1c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a1d0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
2a1e0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
2a1f0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
2a200 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
2a210 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
2a220 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
2a230 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2a240 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
2a250 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2a260 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
2a270 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
2a280 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2a290 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
2a2a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2a2b0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
2a2c0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2a2d0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2a2e0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2a2f0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
2a300 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
2a310 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2a320 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2a330 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
2a340 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2a350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a360 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2a370 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2a380 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
2a390 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
2a3a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a3b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2a3c0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
2a3d0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
2a3e0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2a3f0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2a400 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2a410 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2a420 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2a430 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a440 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
2a450 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
2a460 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2a470 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
2a480 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
2a490 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
2a4a0 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
2a4b0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
2a4c0 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
2a4d0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
2a4e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
2a4f0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
2a500 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2a510 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
2a520 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
2a530 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
2a540 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
2a550 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
2a560 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
2a570 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2a580 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
2a590 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
2a5a0 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
2a5b0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
2a5c0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
2a5d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
2a5e0 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
2a5f0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
2a600 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
2a610 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
2a620 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2a630 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2a640 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
2a650 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2a660 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
2a670 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2a680 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
2a690 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
2a6a0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
2a6b0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
2a6c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2a6d0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
2a6e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
2a6f0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
2a700 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2a710 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
2a720 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
2a730 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
2a740 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
2a750 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
2a760 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
2a770 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
2a780 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
2a790 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
2a7a0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
2a7b0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
2a7c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a7d0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
2a7e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a7f0 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
2a800 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
2a810 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
2a820 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
2a830 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
2a840 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
2a850 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
2a860 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
2a870 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
2a880 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2a890 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
2a8a0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
2a8b0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
2a8c0 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
2a8d0 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
2a8e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2a8f0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
2a900 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
2a910 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
2a920 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
2a930 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
2a940 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
2a950 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a960 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
2a970 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
2a980 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2a990 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2a9a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
2a9b0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
2a9c0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
2a9d0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
2a9e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2a9f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2aa00 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
2aa10 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
2aa20 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
2aa30 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
2aa40 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
2aa50 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
2aa60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2aa70 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
2aa80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2aa90 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
2aaa0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2aab0 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
2aac0 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
2aad0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
2aae0 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
2aaf0 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
2ab00 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
2ab10 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
2ab20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
2ab30 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
2ab40 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
2ab50 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
2ab60 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
2ab70 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
2ab80 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
2ab90 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
2aba0 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
2abb0 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
2abc0 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
2abd0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
2abe0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
2abf0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2ac00 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
2ac10 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
2ac20 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
2ac30 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
2ac40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
2ac50 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
2ac60 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2ac70 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
2ac80 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
2ac90 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
2aca0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
2acb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2acc0 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
2acd0 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
2ace0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2acf0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
2ad00 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
2ad10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2ad20 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2ad30 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2ad40 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
2ad50 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
2ad60 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
2ad70 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
2ad80 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2ad90 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2ada0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2adb0 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
2adc0 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
2add0 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
2ade0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2adf0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
2ae00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ae10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ae20 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae40 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2ae50 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ae80 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2ae90 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
2aea0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2aeb0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2aec0 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
2aed0 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
2aee0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
2aef0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2af00 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2af10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2af20 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2af30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2af40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2af50 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2af60 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
2af70 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
2af80 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
2af90 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
2afa0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2afb0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
2afc0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
2afd0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
2afe0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
2aff0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
2b000 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
2b010 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
2b020 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
2b030 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2b040 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2b050 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
2b060 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74  r->errCode;..  t
2b070 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b080 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
2b090 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2b0a0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2b0b0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2b0c0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2b0d0 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
2b0e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
2b0f0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2b100 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(nPage);.  if( 
2b110 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b120 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  al==0 ){.    ret
2b130 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b140 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2b150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b160 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
2b170 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
2b180 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2b190 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2b1a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b1b0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2b1c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b1d0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
2b1e0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
2b1f0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2b200 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b210 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2b220 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
2b230 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2b240 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
2b250 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
2b260 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
2b270 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2b280 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
2b290 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
2b2a0 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
2b2b0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b2c0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
2b2d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2b2e0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
2b2f0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b300 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
2b310 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2b320 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2b330 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2b340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2b350 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
2b360 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
2b370 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2b380 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
2b390 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
2b3a0 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
2b3b0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
2b3c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2b3d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2b3e0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2b3f0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
2b400 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2b410 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2b420 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2b430 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2b440 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74  .  }...  /* Writ
2b450 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
2b460 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2b470 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2b480 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68  nd open .  ** th
2b490 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
2b4a0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2b4b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b4c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
2b4d0 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
2b4e0 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
2b4f0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
2b500 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
2b510 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
2b520 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2b530 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2b540 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
2b550 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2b560 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2b570 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
2b580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2b590 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
2b5a0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
2b5b0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
2b5c0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
2b5d0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
2b5e0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
2b5f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
2b600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b610 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
2b620 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
2b630 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
2b640 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b650 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
2b660 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b670 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
2b680 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2b690 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2b6a0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
2b6b0 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
2b6c0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2b6d0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
2b6e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2b6f0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
2b700 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
2b710 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
2b720 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
2b730 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
2b740 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
2b750 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2b760 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
2b770 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
2b780 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
2b790 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2b7a0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
2b7b0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
2b7c0 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
2b7d0 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
2b7e0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
2b7f0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
2b800 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
2b810 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68  ory file and, th
2b820 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b830 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20  s .** opened if 
2b840 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  it has not been 
2b850 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74  already. For a t
2b860 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74  emporary file, t
2b870 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f  he opening .** o
2b880 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2b890 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
2b8a0 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
2b8b0 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
2b8c0 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
2b8d0 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20   journal. TODO: 
2b8e0 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f  Why handle tempo
2b8f0 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65  rary files diffe
2b900 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66  rently?.**.** If
2b910 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b920 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20  e is opened (or 
2b930 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
2b940 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a   open), then a.*
2b950 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  * journal-header
2b960 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
2b970 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a  he start of it..
2b980 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
2b990 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
2b9a0 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
2b9b0 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
2b9c0 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
2b9d0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
2b9e0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
2b9f0 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2ba00 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
2ba10 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
2ba20 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
2ba30 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
2ba40 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
2ba50 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
2ba60 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
2ba70 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
2ba80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
2ba90 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
2baa0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
2bab0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
2bac0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
2bad0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
2bae0 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
2baf0 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
2bb00 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
2bb10 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
2bb20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2bb30 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
2bb40 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
2bb50 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
2bb60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2bb70 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
2bb80 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
2bb90 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
2bba0 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
2bbb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2bbc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2bbd0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
2bbe0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
2bbf0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
2bc00 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
2bc10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2bc20 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
2bc30 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2bc40 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2bc50 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
2bc60 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
2bc70 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2bc80 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  e );..    if( pa
2bc90 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bca0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
2bcb0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
2bcc0 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
2bcd0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2bce0 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
2bcf0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
2bd00 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
2bd10 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
2bd20 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
2bd30 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
2bd40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
2bd50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2bd60 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
2bd70 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
2bd80 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
2bd90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2bda0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
2bdb0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
2bdc0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2bdd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
2bde0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
2bdf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2be00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2be10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2be20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2be30 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2be40 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
2be50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
2be60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2be70 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
2be80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
2be90 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
2bea0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
2beb0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
2bec0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
2bed0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
2bee0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
2bef0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
2bf00 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
2bf10 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
2bf20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
2bf30 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
2bf40 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
2bf50 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
2bf60 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
2bf70 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
2bf80 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
2bf90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bfa0 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
2bfb0 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f 20 50  Pager.state to P
2bfc0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 77 68  AGER_RESERVED wh
2bfd0 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
2bfe0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  n.      ** trans
2bff0 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
2c000 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  r to PAGER_EXCLU
2c010 53 49 56 45 2e 20 54 68 69 73 20 69 73 20 62 65  SIVE. This is be
2c020 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
2c030 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ** PAGER_EXCLUSI
2c040 56 45 20 73 74 61 74 65 20 74 68 65 20 63 6f 64  VE state the cod
2c050 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
2c060 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
2c070 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d  tions.      ** m
2c080 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
2c090 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
2c0a0 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
2c0b0 61 73 65 20 66 69 6c 65 20 61 73 20 77 65 6c 6c  ase file as well
2c0c0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 6e 74  .      ** as int
2c0d0 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
2c0e0 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
2c0f0 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 57 41   incorrect in WA
2c100 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
2c110 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c120 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
2c130 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2c140 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20  er->pWal);.     
2c150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c160 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
2c170 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2c180 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2c190 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
2c1a0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c1b0 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
2c1c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c1d0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
2c1e0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2c1f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c200 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c210 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2c220 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2c230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c240 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c250 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
2c260 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c270 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
2c280 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
2c290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c2a0 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
2c2b0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
2c2c0 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
2c2d0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
2c2e0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
2c2f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2c300 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
2c310 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
2c320 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
2c330 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
2c340 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
2c350 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
2c360 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
2c370 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
2c380 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
2c390 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2c3a0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
2c3b0 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
2c3c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2c3d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c3e0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2c3f0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2c400 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
2c410 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
2c420 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2c430 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2c440 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
2c450 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2c460 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c470 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65   }..    /* No ne
2c480 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ed to open the j
2c490 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
2c4a0 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69  his time.  It wi
2c4b0 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65  ll be.    ** ope
2c4c0 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  ned before it is
2c4d0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66   written to.  If
2c4e0 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e   we defer openin
2c4f0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20  g the journal,. 
2c500 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73     ** we might s
2c510 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  ave the work of 
2c520 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
2c530 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2c540 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75  on.    ** ends u
2c550 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e  p being a no-op.
2c560 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 28  .    */..    if(
2c570 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c580 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c590 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2c5a0 69 65 64 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  ied );.      /* 
2c5b0 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72  Ignore any IO er
2c5c0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  ror that occurs 
2c5d0 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e 64  within pager_end
2c5e0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20  _transaction(). 
2c5f0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 75 72  The.      ** pur
2c600 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
2c610 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68  l is to reset th
2c620 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
2c630 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20   of the pager.  
2c640 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65      ** sub-syste
2c650 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61  m. It doesn't ma
2c660 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72  tter if the jour
2c670 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
2c680 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 20 20 2a  properly.      *
2c690 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74  * finalized at t
2c6a0 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65  his point (since
2c6b0 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c   it is not a val
2c6c0 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
2c6d0 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 20 20 2a  anyway)..      *
2c6e0 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  /.      pager_en
2c6f0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2c700 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
2c710 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2c720 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E(("TRANSACTION 
2c730 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2c740 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75  Pager)));.  retu
2c750 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c760 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
2c770 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
2c780 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
2c790 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
2c7a0 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
2c7b0 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
2c7c0 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
2c7d0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
2c7e0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
2c7f0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
2c800 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
2c810 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
2c820 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
2c830 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2c840 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
2c850 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
2c860 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
2c870 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
2c880 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
2c890 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2c8a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
2c8b0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2c8c0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
2c8d0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
2c8e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2c8f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
2c900 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c910 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
2c920 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
2c930 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  ed unless a tran
2c940 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2c950 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74  ady been.  ** st
2c960 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  arted..  */.  as
2c970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2c980 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2c990 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
2c9a0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
2c9b0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
2c9c0 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
2c9d0 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
2c9e0 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  * again..  */.  
2c9f0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2ca00 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65  ->errCode) )  re
2ca10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2ca20 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68  Code;..  /* High
2ca30 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er-level routine
2ca40 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69  s never call thi
2ca50 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61  s function if da
2ca60 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20  tabase is not.  
2ca70 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75  ** writable.  Bu
2ca80 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20  t check anyway, 
2ca90 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e  just for robustn
2caa0 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
2cab0 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64  VER(pPager->read
2cac0 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53  Only) ) return S
2cad0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61  QLITE_PERM;..  a
2cae0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2caf0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
2cb00 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
2cb10 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2cb20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
2cb30 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
2cb40 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2cb50 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
2cb60 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
2cb70 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
2cb80 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
2cb90 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2cba0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
2cbb0 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
2cbc0 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
2cbd0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2cbe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2cbf0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2cc00 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
2cc10 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2cc20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
2cc30 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
2cc40 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
2cc50 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2cc60 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2cc70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2cc80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2cc90 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
2cca0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
2ccb0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
2ccc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68    **.    ** High
2ccd0 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
2cce0 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  s should have al
2ccf0 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61 20  ready started a 
2cd00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20  transaction,.   
2cd10 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20   ** which means 
2cd20 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69 72  they have acquir
2cd30 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
2cd40 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72   locks but the r
2cd50 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2cd60 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
2cd70 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   yet be open..  
2cd80 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2cd90 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
2cda0 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65  pPager, 0, pPage
2cdb0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  r->subjInMemory)
2cdc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2cdd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cde0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cdf0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
2ce00 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 0a  ->pInJournal==0.
2ce10 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2ce20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2ce30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2ce40 46 46 20 0a 20 20 20 20 20 26 26 20 21 70 61 67  FF .     && !pag
2ce50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2ce60 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
2ce70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2ce80 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2ce90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
2cea0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
2ceb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2cec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2ced0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2cee0 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
2cef0 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20  fied = 1;.  .   
2cf00 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
2cf10 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
2cf20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
2cf30 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
2cf40 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
2cf50 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
2cf60 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
2cf70 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
2cf80 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
2cf90 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
2cfa0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
2cfb0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
2cfc0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
2cfd0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
2cfe0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
2cff0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2d000 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
2d010 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
2d020 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2d030 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
2d040 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
2d050 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
2d060 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
2d070 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2d080 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
2d090 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
2d0a0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
2d0b0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
2d0c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2d0d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2d0e0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
2d0f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2d100 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
2d110 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
2d120 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
2d130 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2d140 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
2d150 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
2d160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2d180 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
2d190 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
2d1a0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2d1b0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2d1c0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2d1d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
2d1e0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
2d1f0 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
2d200 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
2d210 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
2d220 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2d230 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2d240 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d250 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2d260 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d290 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2d2a0 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
2d2b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2d2e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d2f0 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   + 4);.         
2d300 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d310 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
2d320 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
2d330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2d340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d350 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2d360 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2d370 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2d380 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b  ->journalOff, ck
2d390 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
2d3a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d3b0 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ff += 4;.       
2d3c0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
2d3d0 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
2d3e0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
2d3f0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d410 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d420 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
2d430 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
2d440 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2d450 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
2d460 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
2d470 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
2d480 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2d490 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
2d4a0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
2d4b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2d4c0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2d4d0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
2d4e0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
2d4f0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2d500 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
2d510 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
2d520 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69         /* Even i
2d530 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
2d540 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ull error occurr
2d550 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  ed while journal
2d560 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20  ling the.       
2d570 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
2d580 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
2d590 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
2d5a0 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
2d5b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  ..        ** Oth
2d5c0 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
2d5d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2d5e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
2d5f0 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20   logic in.      
2d600 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
2d610 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
2d620 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
2d630 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
2d640 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
2d650 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2d660 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
2d670 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2d680 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
2d690 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2d6a0 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
2d6b0 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20   follow..       
2d6c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2d6d0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
2d6e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
2d6f0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2d700 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
2d710 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
2d720 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2d730 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2d740 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  * An error has o
2d750 63 63 75 72 72 65 64 20 77 72 69 74 69 6e 67 20  ccurred writing 
2d760 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2d770 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
2d780 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2d790 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
2d7a0 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
2d7b0 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
2d7c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2d7d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d7e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d7f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d800 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2d810 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
2d820 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d830 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
2d840 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2d850 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
2d860 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2d870 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
2d880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2d8a0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EM );.        as
2d8b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2d8c0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
2d8d0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2d8e0 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61     rc |= addToSa
2d8f0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2d900 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2d910 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d930 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2d950 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EM );.          
2d960 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d970 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2d980 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
2d990 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
2d9a0 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
2d9b0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2d9c0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
2d9d0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
2d9e0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70  YNC;.          p
2d9f0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2da00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2da10 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
2da20 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E(("APPEND %d pa
2da30 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
2da40 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2da50 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2da60 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2da70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2da80 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
2da90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
2daa0 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  :0)));.      }. 
2dab0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
2dac0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
2dad0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2dae0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
2daf0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
2db00 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
2db10 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
2db20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
2db30 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
2db40 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
2db50 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2db60 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
2db70 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
2db80 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
2db90 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
2dba0 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
2dbb0 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
2dbc0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
2dbd0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2dbe0 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
2dbf0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2dc00 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2dc10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
2dc20 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
2dc30 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
2dc40 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
2dc50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2dc60 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
2dc70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2dc80 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
2dc90 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
2dca0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
2dcb0 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
2dcc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
2dcd0 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
2dce0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73   writeable. This
2dcf0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
2dd00 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a   called before .
2dd10 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ** making change
2dd20 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65  s to a page. The
2dd30 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65   caller must che
2dd40 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ck the return va
2dd50 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20  lue .** of this 
2dd60 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20  function and be 
2dd70 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63  careful not to c
2dd80 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
2dd90 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74  ata unless .** t
2dda0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2ddb0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
2ddc0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2ddd0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2dde0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
2ddf0 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
2de00 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
2de10 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
2de20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
2de30 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
2de40 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
2de50 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
2de60 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
2de70 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
2de80 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
2de90 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
2dea0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2deb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
2dec0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2ded0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2dee0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
2def0 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
2df00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2df10 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72  urned.** as appr
2df20 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69  opriate. Otherwi
2df30 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
2df40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2df50 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
2df60 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
2df70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2df80 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
2df90 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
2dfa0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2dfb0 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
2dfc0 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
2dfd0 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
2dfe0 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
2dff0 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50  Size);..  if( nP
2e000 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29  agePerSector>1 )
2e010 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  {.    Pgno nPage
2e020 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
2e030 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2e040 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2e050 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
2e060 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
2e070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2e080 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2e090 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
2e0a0 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20  cated on. */.   
2e0b0 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20   int nPage = 0; 
2e0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e0d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
2e0e0 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
2e0f0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
2e100 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2e110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2e120 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
2e130 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
2e140 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
2e150 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68  ue if any page h
2e160 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
2e170 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  NC */..    /* Se
2e180 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53  t the doNotSyncS
2e190 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20  pill flag to 1. 
2e1a0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2e1b0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
2e1c0 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c      ** a journal
2e1d0 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
2e1e0 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
2e1f0 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
2e200 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73  d by.    ** this
2e210 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
2e220 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
2e230 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
2e240 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
2e250 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b  tSyncSpill==0 );
2e260 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
2e270 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a  otSyncSpill++;..
2e280 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
2e290 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
2e2a0 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
2e2b0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
2e2c0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
2e2d0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
2e2e0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
2e2f0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
2e300 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
2e310 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
2e320 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
2e330 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
2e340 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
2e350 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
2e360 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
2e370 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
2e380 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2e390 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2e3a0 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  (pPager, (int *)
2e3b0 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20  &nPageCount);.  
2e3c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e3d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
2e3e0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
2e3f0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
2e400 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
2e410 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
2e420 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2e430 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
2e440 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
2e450 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  ){.        nPage
2e460 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
2e470 70 67 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pg1;.      }else
2e480 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20  {.        nPage 
2e490 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
2e4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e4b0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
2e4c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 67  .      assert(pg
2e4d0 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
2e4e0 20 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31       assert((pg1
2e4f0 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
2e500 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  o);.    }..    f
2e510 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
2e520 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
2e530 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
2e540 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
2e550 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
2e560 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
2e570 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
2e580 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
2e590 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2e5a0 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
2e5b0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
2e5c0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2e5d0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
2e5e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e5f0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2e600 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
2e610 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2e620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e630 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2e640 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
2e650 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e660 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
2e670 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
2e680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
2e690 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2e6a0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2e6b0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
2e6c0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
2e6d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
2e6e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2e6f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2e700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2e710 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2e720 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
2e730 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
2e740 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2e750 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
2e760 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2e770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
2e780 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2e790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2e7a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e7b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
2e7c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2e7d0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2e7e0 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
2e7f0 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
2e800 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
2e810 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
2e820 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
2e830 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
2e840 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
2e850 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
2e860 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
2e870 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
2e880 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
2e890 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
2e8a0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2e8b0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
2e8c0 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
2e8d0 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
2e8e0 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
2e8f0 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
2e900 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
2e910 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2e920 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2e930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2e940 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
2e950 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2e960 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
2e970 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  c==0 );.      fo
2e980 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2e990 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2e9a0 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
2e9b0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2e9c0 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
2e9d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
2e9e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
2e9f0 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
2ea00 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
2ea10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2ea20 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
2ea30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ea40 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2ea50 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2ea60 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
2ea70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2ea80 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31  oNotSyncSpill==1
2ea90 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2eaa0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d  doNotSyncSpill--
2eab0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2eac0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
2ead0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
2eae0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2eaf0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2eb00 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
2eb10 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
2eb20 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
2eb30 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
2eb40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2eb50 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
2eb60 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
2eb70 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
2eb80 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
2eb90 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2eba0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
2ebb0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
2ebc0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ebd0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
2ebe0 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
2ebf0 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
2ec00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
2ec10 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
2ec20 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
2ec30 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
2ec40 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2ec50 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
2ec60 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
2ec70 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
2ec80 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
2ec90 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
2eca0 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
2ecb0 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69  d as dirty.  Thi
2ecc0 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
2ecd0 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20  xample, when.** 
2ece0 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
2ecf0 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61  n added as a lea
2ed00 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
2ed10 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20  t and so its.** 
2ed20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65  content no longe
2ed30 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  r matters..**.**
2ed40 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
2ed50 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
2ed60 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
2ed70 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
2ed80 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
2ed90 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
2eda0 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20  used. The pager 
2edb0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
2edc0 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
2edd0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
2ede0 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
2edf0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
2ee00 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
2ee10 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
2ee20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
2ee30 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a  eed of large .**
2ee40 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2ee50 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
2ee60 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2ee70 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2ee80 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2ee90 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2eea0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
2eeb0 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
2eec0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2eed0 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47  nt==0 ){.    PAG
2eee0 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57  ERTRACE(("DONT_W
2eef0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
2ef00 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
2ef10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2ef20 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  )));.    IOTRACE
2ef30 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
2ef40 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
2ef50 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e  pgno)).    pPg->
2ef60 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
2ef70 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
2ef80 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
2ef90 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
2efa0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
2efb0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
2efc0 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2efd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2efe0 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
2eff0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
2f000 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2f010 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d  file .** change-
2f020 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20  counter, stored 
2f030 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d  as a 4-byte big-
2f040 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73  endian integer s
2f050 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62  tarting at .** b
2f060 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66  yte offset 24 of
2f070 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2f080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
2f090 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
2f0a0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
2f0b0 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61  is is done by ca
2f0c0 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  lling .** sqlite
2f0d0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
2f0e0 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f   page 1, then mo
2f0f0 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
2f100 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  ents of the.** p
2f110 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69  age data. In thi
2f120 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20  s case the file 
2f130 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20  will be updated 
2f140 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
2f150 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2f160 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
2f170 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74  .** The isDirect
2f180 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e  Mode flag may on
2f190 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
2f1a0 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
2f1b0 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
2f1c0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
2f1d0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2f1e0 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
2f1f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2f200 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
2f210 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2f220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f230 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
2f240 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
2f250 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
2f260 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
2f270 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
2f280 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
2f290 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
2f2a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
2f2b0 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
2f2c0 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
2f2d0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
2f2e0 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
2f2f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f300 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  K;..  /* Declare
2f310 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2f320 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
2f330 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
2f340 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
2f350 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2f360 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
2f370 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
2f380 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
2f390 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
2f3a0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
2f3b0 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
2f3c0 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
2f3d0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
2f3e0 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
2f3f0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
2f400 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
2f410 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
2f420 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
2f430 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2f440 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
2f450 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
2f460 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
2f470 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
2f480 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
2f490 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
2f4a0 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
2f4b0 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
2f4c0 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
2f4d0 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
2f4e0 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
2f4f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2f500 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2f510 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
2f520 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
2f530 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
2f540 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
2f550 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
2f560 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
2f570 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
2f580 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
2f590 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  ode.#endif..  as
2f5a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2f5b0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2f5c0 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50  VED );.  if( !pP
2f5d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2f5e0 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d  tDone && pPager-
2f5f0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
2f600 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f620 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
2f630 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32  age 1 */.    u32
2f640 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
2f650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2f660 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63  itial value of c
2f670 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
2f680 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  eld */..    asse
2f690 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
2f6a0 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
2f6b0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
2f6c0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
2f6d0 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
2f6e0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
2f6f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f700 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2f710 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
2f720 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
2f730 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
2f740 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
2f750 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
2f760 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
2f770 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
2f780 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
2f790 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
2f7a0 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
2f7b0 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
2f7c0 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
2f7d0 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
2f7e0 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
2f7f0 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
2f800 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
2f810 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
2f820 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
2f830 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
2f840 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
2f850 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
2f860 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
2f870 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
2f880 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
2f890 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
2f8a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f8b0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
2f8c0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2f8d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f8e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
2f8f0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2f900 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
2f910 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
2f920 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
2f930 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2f940 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
2f950 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
2f960 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
2f970 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2f980 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
2f990 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2f9a0 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
2f9b0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2f9c0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20  ..      /* Also 
2f9d0 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65  store the SQLite
2f9e0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
2f9f0 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20  in bytes 96..99 
2fa00 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  and in.      ** 
2fa10 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
2fa20 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
2fa30 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
2fa40 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
2fa50 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 76  er.      ** is v
2fa60 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  alid. */.      p
2fa70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
2fa80 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b  )pPgHdr->pData)+
2fa90 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
2faa0 65 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33 32  er);.      put32
2fab0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2fac0 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  Hdr->pData)+96, 
2fad0 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
2fae0 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f  UMBER);..      /
2faf0 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
2fb00 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
2fb10 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2fb20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
2fb30 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
2fb40 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  if( DIRECT_MODE 
2fb50 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2fb60 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20   void *zBuf;.   
2fb70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2fb80 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
2fb90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  0 );.        COD
2fba0 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 48  EC2(pPager, pPgH
2fbb0 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c  dr->pData, 1, 6,
2fbc0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
2fbd0 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  , zBuf);.       
2fbe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fbf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fc00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2fc10 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2fc20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
2fc30 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
2fc40 20 20 20 20 7d 0a 20 20 20 20 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 20 20 20 20 70 50 61  ){.          pPa
2fc70 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2fc80 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
2fc90 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2fca0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2fcb0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2fcc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2fcd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
2fce0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
2fcf0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
2fd00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2fd10 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20  (pPgHdr);.  }.  
2fd20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2fd30 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67  .** Sync the pag
2fd40 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e  er file to disk.
2fd50 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
2fd60 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66   for in-memory f
2fd70 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73  iles.** or pages
2fd80 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e   with the Pager.
2fd90 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e  noSync flag set.
2fda0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2fdb0 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20  sful, or called 
2fdc0 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77  on a pager for w
2fdd0 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d  hich it is a no-
2fde0 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  op, this.** func
2fdf0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2fe00 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
2fe10 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  e, an IO error c
2fe20 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2fe30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2fe40 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
2fe50 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2fe60 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2fe90 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  /.  assert( !MEM
2fea0 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
2feb0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2fec0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2fed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2fee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2fef0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
2ff00 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
2ff10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ff20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
2ff30 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
2ff40 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
2ff50 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
2ff60 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
2ff70 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
2ff80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2ff90 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
2ffa0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2ffb0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
2ffc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
2ffd0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
2ffe0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
2fff0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
30000 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
30010 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
30020 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
30030 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
30040 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a  ne ensures that:
30050 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
30060 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
30070 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75  nge-counter is u
30080 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74  pdated,.**   * t
30090 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
300a0 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65  nced (unless the
300b0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
300c0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
300d0 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20  ed),.**   * all 
300e0 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20  dirty pages are 
300f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
30100 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a  atabase file, .*
30110 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
30120 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  se file is trunc
30130 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65  ated (if require
30140 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  d), and.**   * t
30150 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30160 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
30170 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
30180 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  hat remains to c
30190 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
301a0 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61  ction is to fina
301b0 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65  lize .** (delete
301c0 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  , truncate or ze
301d0 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72  ro the first par
301e0 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61  t of) the journa
301f0 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64  l file (or .** d
30200 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
30210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
30220 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
30230 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
30240 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
30250 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
30260 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
30270 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
30280 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
30290 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
302a0 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
302b0 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61   If the final pa
302c0 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63  rameter - noSync
302d0 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e   - is true, then
302e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
302f0 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20  le itself.** is 
30300 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20  not synced. The 
30310 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
30320 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
30330 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  c() directly to.
30340 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  ** sync the data
30350 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
30360 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50   calling CommitP
30370 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c  haseTwo() to del
30380 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ete the.** journ
30390 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  al file in this 
303a0 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  case..*/.int sql
303b0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
303c0 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72  haseOne(.  Pager
303d0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
303e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
303f0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
30400 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
30410 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
30420 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
30430 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
30440 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  al name */.  int
30450 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20   noSync         
30460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30470 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65  True to omit the
30480 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62   xSync on the db
30490 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
304a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
304b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
304c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
304d0 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67  .  /* The dbOrig
304e0 53 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65  Size is never se
304f0 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  t if journal_mod
30500 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72  e=OFF */.  asser
30510 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
30520 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
30530 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
30540 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
30550 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ize==0 );..  /* 
30560 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  If a prior error
30570 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72   occurred, repor
30580 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61  t that error aga
30590 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  in. */.  if( pPa
305a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
305b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
305c0 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
305d0 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
305e0 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
305f0 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
30600 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
30610 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
30620 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
30630 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66  >dbSize));..  if
30640 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
30650 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
30660 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
30670 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
30680 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
30690 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
306a0 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
306b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
306c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
306d0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73  alled, it is mos
306e0 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f  tly a no-op.  Ho
306f0 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a  wever, any.    *
30700 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67  * backup in prog
30710 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65  ress needs to be
30720 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20   restarted..    
30730 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  */.    sqlite3Ba
30740 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
30750 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
30760 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
30770 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
30780 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d  YNCED && pPager-
30790 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20  >dbModified ){. 
307a0 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
307b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
307c0 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74      PgHdr *pList
307d0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
307e0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
307f0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
30800 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
30810 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
30820 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
30830 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72  r, pList, pPager
30840 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20  ->dbSize, 1, .  
30850 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
30860 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50  r->fullSync ? pP
30870 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
30880 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b   : 0).        );
30890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
308a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
308b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
308c0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
308d0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
308e0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
308f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
30900 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
30910 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20  ock updates the 
30920 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
30930 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20  Exactly how it. 
30940 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69       ** does thi
30950 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  s depends on whe
30960 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
30970 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
30980 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  timization.     
30990 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20   ** was enabled 
309a0 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
309b0 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61   and if this tra
309c0 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74  nsaction meets t
309d0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e  he .      ** run
309e0 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f  time criteria to
309f0 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69   use the operati
30a00 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  on: .      **.  
30a10 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
30a20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
30a30 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
30a40 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
30a50 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  or.      **     
30a60 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
30a70 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a  page-size, and .
30a80 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
30a90 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74  is commit is not
30aa0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
30ab0 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
30ac0 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  n, and.      ** 
30ad0 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65     * Exactly one
30ae0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d   page has been m
30af0 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72  odified and stor
30b00 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30b10 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
30b20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
30b30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73  optimization was
30b40 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20   not enabled at 
30b50 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
30b60 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
30b70 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
30b80 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74  ecounter() funct
30b90 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
30ba0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
30bb0 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e  ge.      ** coun
30bc0 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
30bd0 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
30be0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
30bf0 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
30c00 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
30c10 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
30c20 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
30c30 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
30c40 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20  alCreate().     
30c50 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   ** to make sure
30c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30c70 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62  e has actually b
30c80 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65  een created, the
30c90 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  n call.      ** 
30ca0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
30cb0 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70  ecounter() to up
30cc0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
30cd0 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72  counter in indir
30ce0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  ect.      ** mod
30cf0 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  e. .      **.   
30d00 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
30d10 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
30d20 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61  tion is both ena
30d30 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61  bled and applica
30d40 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ble,.      ** th
30d50 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e  en call pager_in
30d60 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
30d70 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
30d80 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a   change-counter.
30d90 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72        ** in 'dir
30da0 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68  ect' mode. In th
30db0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
30dc0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
30dd0 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ver be.      ** 
30de0 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
30df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
30e00 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20      */.  #ifdef 
30e10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
30e20 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
30e30 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
30e40 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
30e50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
30e60 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
30e70 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
30e80 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
30e90 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
30ea0 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  er && isOpen(pPa
30eb0 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
30ec0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
30ed0 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
30ee0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
30ef0 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65  .       && pPage
30f00 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
30f10 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  r->dbFileSize.  
30f20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
30f30 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
30f40 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
30f50 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
30f60 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
30f70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30f80 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
30f90 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
30fa0 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72  nter via the dir
30fb0 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64  ect-write method
30fc0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
30fd0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  * following call
30fe0 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65   will modify the
30ff0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
31000 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67  sentation of pag
31010 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  e 1 .        ** 
31020 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
31030 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f  pdated change co
31040 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
31050 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20  rite page 1 .   
31060 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
31070 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31080 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
31090 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
310a0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  te .        ** p
310b0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
310c0 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
310d0 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20   this is safe.. 
310e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
310f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
31100 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
31110 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
31120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
31140 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
31150 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
31160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31180 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
31190 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
311a0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
311b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65    }.      }.  #e
311c0 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70  lse.      rc = p
311d0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
311e0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
311f0 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20  0);.  #endif.   
31200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31210 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
31220 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
31230 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  t;.  .      /* I
31240 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
31250 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
31260 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
31270 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
31280 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
31290 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
312a0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
312b0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
312c0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
312d0 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63   ** file. This c
312e0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
312f0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
31300 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  de..      **.   
31310 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
31320 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
31330 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
31340 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
31350 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65   .      ** curre
31360 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
31370 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62  r.dbSize, set db
31380 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  Size back to the
31390 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
313a0 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20  that it took at 
313b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
313c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74   transaction. Ot
313d0 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20  herwise, the.   
313e0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
313f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
31400 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70   return zeroed p
31410 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ages instead of 
31420 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  .      ** readin
31430 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  g data from the 
31440 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
31450 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31460 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   When journal_mo
31470 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f 72  de==OFF the dbOr
31480 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79 73  igSize is always
31490 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20   zero, so this. 
314a0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65       ** block ne
314b0 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72  ver runs if jour
314c0 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20  nal_mode=OFF..  
314d0 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66      */.  #ifndef
314e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
314f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
31500 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
31510 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  <pPager->dbOrigS
31520 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20 41  ize .       && A
31530 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f  LWAYS(pPager->jo
31540 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
31550 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
31560 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
31570 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20     Pgno i;      
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
315a0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
315b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  e */.        con
315c0 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20  st Pgno iSkip = 
315d0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
315e0 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e  ager); /* Pendin
315f0 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20  g lock page */. 
31600 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e         const Pgn
31610 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  o dbSize = pPage
31620 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20  r->dbSize;      
31630 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61   /* Database ima
31640 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20  ge size */ .    
31650 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
31660 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
31670 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  rigSize;.       
31680 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31   for( i=dbSize+1
31690 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ; i<=pPager->dbO
316a0 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  rigSize; i++ ){.
316b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
316c0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
316d0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
316e0 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
316f0 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
31700 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31720 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  Page to journal 
31730 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
31740 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31750 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
31760 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
31770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31780 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
31790 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
317a0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
317b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
317c0 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  rWrite(pPage);. 
317d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
317e0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
317f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
31800 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31810 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31820 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
31850 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
31860 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 20  dbSize;.      } 
31870 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20 20  .  #endif.  .   
31880 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
31890 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
318a0 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
318b0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20  rnal file. If a 
318c0 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a 2a  master .      **
318d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
318e0 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
318f0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
31900 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
31910 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 66   .      ** or if
31920 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c   zMaster is NULL
31930 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72   (no master jour
31940 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20  nal), then this 
31950 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
31960 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31970 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
31980 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
31990 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
319a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
319b0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
319c0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
319d0 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63    .      /* Sync
319e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
319f0 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63  e. If the atomic
31a00 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
31a10 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  tion is being.  
31a20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69      ** used, thi
31a30 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  s call will not 
31a40 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  create the journ
31a50 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f  al file or perfo
31a60 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  rm any.      ** 
31a70 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a  real IO..      *
31a80 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  /.      rc = syn
31a90 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
31aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31ac0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31ad0 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
31ae0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
31af0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
31b00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31b10 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31b20 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
31b30 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  st(sqlite3Pcache
31b40 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
31b50 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20  ->pPCache));.   
31b60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31b80 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31b90 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
31ba0 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
31bb0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31bc0 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  e_exit;.      }.
31bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
31be0 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
31bf0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
31c00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
31c10 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
31c20 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69   not the same si
31c30 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ze as the databa
31c40 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20  se image,.      
31c50 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65  ** then use page
31c60 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72  r_truncate to gr
31c70 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65  ow or shrink the
31c80 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
31c90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
31ca0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70  Pager->dbSize!=p
31cb0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
31cc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  e ){.        Pgn
31cd0 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d  o nNew = pPager-
31ce0 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65  >dbSize - (pPage
31cf0 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52  r->dbSize==PAGER
31d00 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
31d10 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31d20 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
31d30 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
31d40 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  E );.        rc 
31d50 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
31d60 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a  (pPager, nNew);.
31d70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31d80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31d90 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31da0 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  e_exit;.      }.
31db0 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61    .      /* Fina
31dc0 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61  lly, sync the da
31dd0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
31de0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
31df0 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f  r->noSync && !no
31e00 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
31e10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
31e20 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
31e30 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
31e40 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
31e50 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59    IOTRACE(("DBSY
31e60 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
31e70 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  )).    }..    pP
31e80 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
31e90 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
31ea0 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e  .commit_phase_on
31eb0 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e  e_exit:.  return
31ec0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
31ed0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
31ee0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
31ef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
31f00 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  as been complete
31f10 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f  ly.** updated to
31f20 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61   reflect the cha
31f30 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
31f40 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
31f50 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63  tion and.** sync
31f60 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20  ed to disk. The 
31f70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69  journal file sti
31f80 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ll exists in the
31f90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
31fa0 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20   though, and if 
31fb0 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
31fc0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
31fd0 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  t will eventuall
31fe0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20  y.** be used as 
31ff0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
32000 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
32010 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
32020 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
32030 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c  s function final
32040 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
32050 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79   file, either by
32060 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74   deleting, .** t
32070 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72  runcating or par
32080 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69  tially zeroing i
32090 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  t, so that it ca
320a0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a  nnot be used .**
320b0 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   for hot-journal
320c0 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20   rollback. Once 
320d0 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65  this is done the
320e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
320f0 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63  ** irrevocably c
32100 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
32110 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
32120 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
32130 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32140 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a   and the pager.*
32150 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65  * moves into the
32160 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74   error state. Ot
32170 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
32180 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
32190 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
321a0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
321b0 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
321c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
321d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
321e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
321f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
32200 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
32210 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
32220 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65 72  ed if a prior er
32230 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
32240 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64  ..  ** But if (d
32250 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
32260 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69  rror elsewhere i
32270 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69 74  n the system) it
32280 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63   does get.  ** c
32290 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75  alled, just retu
322a0 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
322b0 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64  r code without d
322c0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a  oing anything. *
322d0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
322e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
322f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
32300 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54  errCode;..  /* T
32310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
32320 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
32330 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  d if the pager i
32340 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73  s not in at leas
32350 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53  t.  ** PAGER_RES
32360 45 52 56 45 44 20 73 74 61 74 65 2e 20 2a 2a 46  ERVED state. **F
32370 49 58 4d 45 2a 2a 3a 20 4d 61 6b 65 20 69 74 20  IXME**: Make it 
32380 73 6f 20 74 68 61 74 20 74 68 69 73 20 74 65 73  so that this tes
32390 74 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 66 61  t always.  ** fa
323a0 69 6c 73 20 2d 20 6d 61 6b 65 20 69 74 20 73 6f  ils - make it so
323b0 20 74 68 61 74 20 77 65 20 6e 65 76 65 72 20 72   that we never r
323c0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
323d0 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 6f 6c  if we do not hol
323e0 64 0a 20 20 2a 2a 20 61 6c 6c 20 6e 65 63 65 73  d.  ** all neces
323f0 73 61 72 79 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2f  sary locks..  */
32400 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
32410 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
32420 56 45 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c  VED ) return SQL
32430 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  ITE_ERROR;..  /*
32440 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   An optimization
32450 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
32460 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  e was not actual
32470 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ly modified duri
32480 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72 61  ng.  ** this tra
32490 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61  nsaction, the pa
324a0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
324b0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
324c0 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73 69   and is.  ** usi
324d0 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  ng persistent jo
324e0 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68 69  urnals, then thi
324f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
32500 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
32510 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   The start of th
32520 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
32530 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
32540 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  s a single journ
32550 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  al .  ** header 
32560 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66 69  with the nRec fi
32570 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49 66  eld set to 0. If
32580 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20   such a journal 
32590 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a 20  is used as.  ** 
325a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75  a hot-journal du
325b0 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
325c0 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61   rollback, 0 cha
325d0 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
325e0 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61  e.  ** to the da
325f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20  tabase file. So 
32600 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
32610 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75   to zero the jou
32620 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65  rnal .  ** heade
32630 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  r. Since the pag
32640 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
32650 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20 69  ve mode, there i
32660 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74  s no need.  ** t
32670 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73  o drop any locks
32680 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20   either..  */.  
32690 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
326a0 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50 61  dified==0 && pPa
326b0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
326c0 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  de .   && pPager
326d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
326e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
326f0 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20 20  _PERSIST.  ){.  
32700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32710 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
32720 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
32730 67 65 72 29 20 7c 7c 20 21 70 50 61 67 65 72 2d  ger) || !pPager-
32740 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
32750 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32760 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  _OK;.  }..  PAGE
32770 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20  RTRACE(("COMMIT 
32780 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
32790 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65  Pager)));.  asse
327a0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
327b0 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
327c0 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61  || MEMDB || !pPa
327d0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
327e0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
327f0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
32800 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
32810 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  setMaster);.  re
32820 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
32830 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
32840 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
32850 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65  all changes. The
32860 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
32870 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
32880 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ARED mode..**.**
32890 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
328a0 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b  erforms two task
328b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74  s:.**.**   1) It
328c0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20   rolls back the 
328d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65  journal file, re
328e0 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61  storing all data
328f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a  base file and .*
32900 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  *      in-memory
32910 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20   cache pages to 
32920 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77  the state they w
32930 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20  ere in when the 
32940 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
32950 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20      was opened, 
32960 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66  and.**   2) It f
32970 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
32980 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68  rnal file, so th
32990 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65  at it is not use
329a0 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20  d for hot.**    
329b0 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e    rollback at an
329c0 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  y point in the f
329d0 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62  uture..**.** sub
329e0 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ject to the foll
329f0 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74  owing qualificat
32a00 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  ions:.**.** * If
32a10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32a20 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  e is not yet ope
32a30 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
32a40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
32a50 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28  **   then only (
32a60 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  2) is performed.
32a70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32a80 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61  ere is no journa
32a90 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72  l file.**   to r
32aa0 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  oll back..**.** 
32ab0 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72  * If in an error
32ac0 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
32ad0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74  n SQLITE_FULL, t
32ae0 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20  hen task (1) is 
32af0 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e  .**   performed.
32b00 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
32b10 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64  task (2). Regard
32b20 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
32b30 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68  ome.**   of eith
32b40 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74  er, the error st
32b50 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
32b60 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
32b70 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69  e caller.**   (i
32b80 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54  .e. either SQLIT
32b90 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
32ba0 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
32bb0 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  * * If the pager
32bc0 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53   is in PAGER_RES
32bd0 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
32be0 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57  n attempt (1). W
32bf0 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e  hether.**   or n
32c00 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 65 73  ot (1) is succes
32c10 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d  sful, also attem
32c20 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65  pt (2). If succe
32c30 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
32c40 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74     SQLITE_OK. Ot
32c50 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74  herwise, enter t
32c60 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
32c70 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  nd return the fi
32c80 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20  rst .**   error 
32c90 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  code encountered
32ca0 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  . .**.**   In th
32cb0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
32cc0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
32cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
32ce0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a   written to. .**
32cf0 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f     So is safe to
32d00 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
32d10 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20  urnal file even 
32d20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  if the playback 
32d30 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e  .**   (operation
32d40 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65   1) failed. Howe
32d50 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75  ver the pager mu
32d60 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  st enter the err
32d70 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73  or state.**   as
32d80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
32d90 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
32da0 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73  ache are now sus
32db0 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69  pect..**.** * Fi
32dc0 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47  nally, if in PAG
32dd0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61  ER_EXCLUSIVE sta
32de0 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  te, then attempt
32df0 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20   (1). Only.**   
32e00 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28  attempt (2) if (
32e10 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  1) is successful
32e20 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
32e30 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
32e40 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65  ,.**   otherwise
32e50 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
32e60 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72   state and retur
32e70 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
32e80 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20   from the .**   
32e90 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f  failing operatio
32ea0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  n..**.**   In th
32eb0 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61  is case the data
32ec0 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61  base file may ha
32ed0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
32ee0 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a  to. So if the.**
32ef0 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72     playback oper
32f00 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75  ation did not su
32f10 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e  cceed it would n
32f20 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69  ot be safe to fi
32f30 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20  nalize.**   the 
32f40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
32f50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66   needs to be lef
32f60 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
32f70 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20  stem so that.** 
32f80 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f    some other pro
32f90 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20  cess can use it 
32fa0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
32fb0 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62  atabase state (b
32fc0 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e  y.**   hot-journ
32fd0 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f  al rollback)..*/
32fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
32ff0 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
33000 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
33010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
33020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33030 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
33040 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  */.  PAGERTRACE(
33050 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
33060 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
33070 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67 65 72  )));.  if( pager
33080 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33090 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
330a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
330b0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
330c0 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54  Pager, SAVEPOINT
330d0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a  _ROLLBACK, -1);.
330e0 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
330f0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
33100 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
33110 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  setMaster);.    
33120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33130 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
33140 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
33150 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
33160 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
33170 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
33180 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
33190 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72  r->jfd) ){.    r
331a0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
331b0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
331c0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
331d0 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
331e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
331f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
33200 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
33210 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
33220 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
33230 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
33240 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
33250 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
33260 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
33270 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
33280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
33290 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
332a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
332b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
332c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
332d0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
332e0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
332f0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
33300 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
33310 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
33320 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
33330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33340 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
33350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33360 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
33370 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
33380 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
33390 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
333a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
333b0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
333c0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
333d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
333e0 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
333f0 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
33400 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
33410 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
33420 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
33430 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
33440 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
33450 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
33460 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
33470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33480 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
33490 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
334a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
334b0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
334c0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
334d0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
334e0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
334f0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
33500 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
33510 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
33520 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
33530 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
33540 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33550 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33560 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
33570 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33580 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
33590 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
335a0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
335b0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
335c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
335d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
335e0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
335f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33600 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33610 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20  the approximate 
33620 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
33630 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  of memory curren
33640 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  tly.** used by t
33650 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73  he pager and its
33660 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68   associated cach
33670 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
33680 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61  3PagerMemUsed(Pa
33690 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
336a0 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20  int perPageSize 
336b0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
336c0 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ze + pPager->nEx
336d0 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75  tra + 20;.  retu
336e0 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73  rn perPageSize*s
336f0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
33700 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
33710 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20 20  Cache).         
33720 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f    + sqlite3Mallo
33730 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  cSize(pPager);.}
33740 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33750 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
33760 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
33770 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
33780 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33790 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44  erPageRefcount(D
337a0 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  bPage *pPage){. 
337b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
337c0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
337d0 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66  t(pPage);.}..#if
337e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
337f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
33800 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
33810 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
33820 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
33830 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
33840 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
33850 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
33860 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
33870 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
33880 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
33890 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20  PCache);.  a[1] 
338a0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  = sqlite3PcacheP
338b0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
338c0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32  >pPCache);.  a[2
338d0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
338e0 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eGetCachesize(pP
338f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33900 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
33910 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28  >dbSizeValid ? (
33920 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53  int) pPager->dbS
33930 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d  ize : -1;.  a[4]
33940 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
33950 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
33960 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
33970 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
33980 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
33990 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
339a0 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
339b0 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
339c0 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
339d0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
339e0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
339f0 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
33a00 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
33a10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
33a20 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
33a30 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
33a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33a50 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
33a60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
33a70 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a  urn MEMDB;.}../*
33a80 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
33a90 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
33aa0 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
33ab0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66  epoints open. If
33ac0 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75   there are.** cu
33ad0 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61  rrently less tha
33ae0 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70  n nSavepoints op
33af0 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e  en, then open on
33b00 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
33b10 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ints.** to make 
33b20 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  up the differenc
33b30 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  e. If the number
33b40 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69   of savepoints i
33b50 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75  s already.** equ
33b60 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74  al to nSavepoint
33b70 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
33b80 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
33b90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
33ba0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
33bb0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
33bc0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  M is returned. I
33bd0 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
33be0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
33bf0 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ing the sub-jour
33c00 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61  nal file, then a
33c10 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
33c20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
33c30 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
33c40 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
33c50 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
33c60 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
33c70 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70  ager, int nSavep
33c80 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
33c90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
33ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33cb0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
33cc0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72  e */.  int nCurr
33cd0 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  ent = pPager->nS
33ce0 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
33cf0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62   /* Current numb
33d00 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
33d10 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65   */..  if( nSave
33d20 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26  point>nCurrent &
33d30 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
33d40 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
33d50 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
33d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d70 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
33d80 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
33d90 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
33da0 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  aNew;           
33db0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50          /* New P
33dc0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
33dd0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
33de0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
33df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
33e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
33e20 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
33e30 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
33e40 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
33e50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
33e60 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f  eturn rc;..    /
33e70 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
33e80 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
33e90 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
33ea0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
33eb0 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
33ec0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
33ed0 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
33ee0 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
33ef0 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
33f00 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
33f10 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
33f20 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
33f30 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
33f40 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
33f50 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
33f60 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
33f70 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
33f80 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
33f90 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
33fa0 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
33fb0 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
33fc0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
33fd0 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
33fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33ff0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
34000 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
34010 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
34020 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
34030 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
34040 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
34050 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
34060 20 3d 20 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = aNew;..    /*
34070 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61   Populate the Pa
34080 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72  gerSavepoint str
34090 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c  uctures just all
340a0 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66  ocated. */.    f
340b0 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20  or(ii=nCurrent; 
340c0 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  ii<nSavepoint; i
340d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77  i++){.      aNew
340e0 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61  [ii].nOrig = nPa
340f0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ge;.      if( is
34100 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
34110 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
34120 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
34130 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
34140 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
34150 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
34160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34170 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
34180 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
34190 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
341a0 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
341b0 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
341c0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
341d0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
341e0 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
341f0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
34200 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
34210 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53  ( !aNew[ii].pInS
34220 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
34230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34240 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
34250 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72  .      if( pager
34260 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
34270 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34280 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50  3WalSavepoint(pP
34290 61 67 65 72 2d 3e 70 57 61 6c 2c 20 61 4e 65 77  ager->pWal, aNew
342a0 5b 69 69 5d 2e 61 57 61 6c 44 61 74 61 29 3b 0a  [ii].aWalData);.
342b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
342c0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
342d0 20 3d 20 69 69 2b 31 3b 0a 20 20 20 20 7d 0a 20   = ii+1;.    }. 
342e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
342f0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 6e  r->nSavepoint==n
34300 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20  Savepoint );.   
34310 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
34320 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
34330 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
34340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
34350 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
34360 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
34370 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f  k or release (co
34380 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e  mmit) a savepoin
34390 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  t..** The savepo
343a0 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  int to release o
343b0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20  r rollback need 
343c0 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20  not be the most 
343d0 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65  recently .** cre
343e0 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  ated savepoint..
343f0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
34400 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  op is always eit
34410 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
34420 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f  LLBACK or SAVEPO
34430 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20  INT_RELEASE..** 
34440 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
34450 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
34460 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73   release and des
34470 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
34480 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  nt with.** index
34490 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20   iSavepoint. If 
344a0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
344b0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72  ROLLBACK, then r
344c0 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
344d0 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ges.** that have
344e0 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20   occurred since 
344f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
34500 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
34510 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
34520 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c  avepoint to roll
34530 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
34540 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
34550 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69   parameter .** i
34560 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c  Savepoint. A val
34570 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f  ue of 0 means to
34580 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
34590 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
345a0 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73  int.** (the firs
345b0 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61  t created). A va
345c0 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53  lue of (Pager.nS
345d0 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e  avepoint-1) mean
345e0 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20  s operate.** on 
345f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
34600 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  y created savepo
34610 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69  int. If iSavepoi
34620 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
34630 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61  an.** (Pager.nSa
34640 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e  vepoint-1), then
34650 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34660 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
34670 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76   If a negative v
34680 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74  alue is passed t
34690 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
346a0 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
346b0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
346c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
346d0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
346e0 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a  nt to calling .*
346f0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
34700 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65  llback() because
34710 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
34720 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
34730 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  e.** the transac
34740 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  tion or unlock t
34750 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
34760 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68  just restores th
34770 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
34780 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
34790 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
347a0 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20  tate. .**.** In 
347b0 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  any case, all sa
347c0 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
347d0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
347e0 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
347f0 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
34800 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  . If this is a r
34810 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  elease operation
34820 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
34830 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65  RELEASE),.** the
34840 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  n savepoint iSav
34850 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64  epoint is also d
34860 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
34870 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
34880 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
34890 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72  NOMEM if a memor
348a0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
348b0 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20  ls,.** or an IO 
348c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
348d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
348e0 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
348f0 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f  ack a .** savepo
34900 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  int. If no error
34910 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  s occur, SQLITE_
34920 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
34930 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
34940 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
34950 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
34960 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
34970 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
34980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
34990 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
349a0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
349b0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
349c0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
349d0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
349e0 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 || op==SAVEPOI
349f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
34a00 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
34a10 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
34a20 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
34a30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
34a40 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
34a50 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  le */.    int nN
34a60 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
34a70 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e  Number of remain
34a80 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ing savepoints a
34a90 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f  fter this op. */
34aa0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
34ab0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76  out how many sav
34ac0 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69  epoints will sti
34ad0 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
34ae0 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f  er this.    ** o
34af0 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20  peration. Store 
34b00 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e  this value in nN
34b10 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65  ew. Then free re
34b20 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74  sources associat
34b30 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ed .    ** with 
34b40 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
34b50 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65  hat are destroye
34b60 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
34b70 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
34b80 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e  nNew = iSavepoin
34b90 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50  t + (( op==SAVEP
34ba0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f  OINT_RELEASE ) ?
34bb0 20 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72   0 : 1);.    for
34bc0 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61  (ii=nNew; ii<pPa
34bd0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
34be0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71   ii++){.      sq
34bf0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
34c00 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
34c10 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
34c20 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
34c30 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
34c40 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20  point = nNew;.. 
34c50 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
34c60 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
34c70 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
34c80 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
34c90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
34ca0 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20  journal to zero 
34cb0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a  bytes in size. *
34cc0 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  /.    if( op==SA
34cd0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
34ce0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65  ){.      if( nNe
34cf0 77 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70  w==0 && isOpen(p
34d00 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
34d10 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
34d20 74 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69  truncate if it i
34d30 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  s an in-memory s
34d40 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
34d50 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
34d60 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
34d70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
34d80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
34d90 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
34da0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30  (pPager->sjfd, 0
34db0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
34dc0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34dd0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OK );.        }.
34de0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34df0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20  nSubRec = 0;.   
34e00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
34e10 2a 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61  * Else this is a
34e20 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
34e30 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68  ion, playback th
34e40 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
34e50 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66  point..    ** If
34e60 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d   this is a temp-
34e70 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73  file, it is poss
34e80 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ible that the jo
34e90 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20  urnal file has. 
34ea0 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65     ** not yet be
34eb0 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  en opened. In th
34ec0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61  is case there ha
34ed0 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
34ee0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  es to.    ** the
34ef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
34f00 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  so the playback 
34f10 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65  operation can be
34f20 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
34f30 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 61  .    else if( pa
34f40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34f50 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  ) || isOpen(pPag
34f60 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
34f70 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
34f80 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28   *pSavepoint = (
34f90 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67  nNew==0)?0:&pPag
34fa0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e  er->aSavepoint[n
34fb0 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63  New-1];.      rc
34fc0 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b   = pagerPlayback
34fd0 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
34fe0 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
34ff0 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d       assert(rc!=
35000 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20  SQLITE_DONE);.  
35010 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74    }.  .  }.  ret
35020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
35030 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
35040 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
35050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
35060 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
35070 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
35080 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
35090 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
350a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
350b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
350c0 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
350d0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
350e0 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
350f0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
35100 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
35110 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35120 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
35130 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35140 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
35150 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
35160 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
35170 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
35180 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
35190 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
351a0 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
351b0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
351c0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
351d0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
351e0 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
351f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
35200 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
35210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
35220 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
35230 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
35240 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
35250 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
35260 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
35270 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35280 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
35290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
352a0 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
352b0 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
352c0 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
352d0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
352e0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
352f0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
35300 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
35310 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
35320 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
35330 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
35340 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
35350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
35360 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
35370 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
35380 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
35390 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  pager.*/.static 
353a0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
353b0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
353c0 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
353d0 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
353e0 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
353f0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
35400 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
35410 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20  id*,int,int),.  
35420 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
35430 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  e)(void*),.  voi
35440 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69  d *pCodec.){.  i
35450 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
35460 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
35470 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
35480 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50  r->pCodec);.  pP
35490 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70  ager->xCodec = p
354a0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30  Pager->memDb ? 0
354b0 20 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   : xCodec;.  pPa
354c0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
354d0 68 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65  hng = xCodecSize
354e0 43 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Chng;.  pPager->
354f0 78 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f  xCodecFree = xCo
35500 64 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65  decFree;.  pPage
35510 72 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64  r->pCodec = pCod
35520 65 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72  ec;.  pagerRepor
35530 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  tSize(pPager);.}
35540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71  .static void *sq
35550 6c 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64  lite3PagerGetCod
35560 65 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ec(Pager *pPager
35570 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
35580 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65  er->pCodec;.}.#e
35590 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
355a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
355b0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
355c0 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
355d0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
355e0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
355f0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
35600 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
35610 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
35620 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
35630 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
35640 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
35650 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
35660 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
35670 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
35680 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
35690 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20  usly located at 
356a0 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
356b0 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
356c0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
356d0 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
356e0 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
356f0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
35700 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
35710 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
35720 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
35730 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
35740 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
35750 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
35760 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
35770 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
35780 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
35790 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
357a0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
357b0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
357c0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
357d0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
357e0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
357f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35800 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
35810 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
35820 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
35830 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
35840 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
35850 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
35860 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
35870 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
35880 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
35890 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
358a0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
358b0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
358c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
358d0 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69  urth argument, i
358e0 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d  sCommit, is non-
358f0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
35900 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  page is being.**
35910 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f   moved as part o
35920 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f  f a database reo
35930 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74  rganization just
35940 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
35950 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62  saction .** is b
35960 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
35970 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74  In this case, it
35980 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
35990 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
359a0 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65   page .** pPg re
359b0 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74  fers to will not
359c0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61   be written to a
359d0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
359e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
359f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
35a00 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
35a10 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
35a20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
35a30 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
35a40 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  urs. Otherwise, 
35a50 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
35a60 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
35a70 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
35a80 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
35a90 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
35aa0 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43  no pgno, int isC
35ab0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20  ommit){.  PgHdr 
35ac0 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20  *pPgOld;        
35ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
35ae0 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
35af0 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20  tten. */.  Pgno 
35b00 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
35b10 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76  ;       /* Old v
35b20 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e  alue of pPg->pgn
35b30 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65  o, if sync is re
35b40 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
35b50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
35b60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35b70 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn code */.  Pgn
35b80 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20  o origPgno;     
35b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
35ba0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e   original page n
35bb0 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  umber */..  asse
35bc0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
35bd0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65  );..  /* In orde
35be0 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  r to be able to 
35bf0 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d  rollback, an in-
35c00 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
35c10 6d 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  must journal.  *
35c20 2a 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  * the page we ar
35c30 65 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20  e moving from.. 
35c40 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
35c50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
35c60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
35c70 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
35c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
35c90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
35ca0 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73  e being moved is
35cb0 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e   dirty and has n
35cc0 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79  ot been saved by
35cd0 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a   the latest.  **
35ce0 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
35cf0 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
35d00 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
35d10 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
35d20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  .  ** sub-journa
35d30 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72  l now. This is r
35d40 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c  equired to handl
35d50 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
35d60 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20  scenario:.  **. 
35d70 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a   **   BEGIN;.  *
35d80 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
35d90 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69  age X, then modi
35da0 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e  fy it in memory>
35db0 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f  .  **     SAVEPO
35dc0 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20  INT one;.  **   
35dd0 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58      <Move page X
35de0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a   to location Y>.
35df0 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
35e00 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  K TO one;.  **. 
35e10 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65   ** If page X we
35e20 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  re not written t
35e30 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
35e40 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64  l here, it would
35e50 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73   not.  ** be pos
35e60 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65  sible to restore
35e70 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68   its contents wh
35e80 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
35e90 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74   TO one".  ** st
35ea0 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20  atement were is 
35eb0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a  processed..  **.
35ec0 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50    ** subjournalP
35ed0 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74  age() may need t
35ee0 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
35ef0 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70   to store pPg->p
35f00 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e  gno into.  ** on
35f10 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
35f20 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69  int bitvecs. Thi
35f30 73 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20  s is the reason 
35f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
35f50 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
35f60 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f  LITE_NOMEM..  */
35f70 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
35f80 73 26 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20  s&PGHDR_DIRTY.  
35f90 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
35fa0 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20  Page(pPg).   && 
35fb0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
35fc0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
35fd0 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  pPg)).  ){.    r
35fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
35ff0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f   PAGERTRACE(("MO
36000 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
36010 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
36020 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
36030 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
36040 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
36050 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
36060 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
36070 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41   pgno));.  IOTRA
36080 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
36090 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
360a0 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
360b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
360c0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
360d0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
360e0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
360f0 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69   can.  ** be wri
36100 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70  tten to, store p
36110 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61  Pg->pgno in loca
36120 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53  l variable needS
36130 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20  yncPgno..  **.  
36140 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d  ** If the isComm
36150 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  it flag is set, 
36160 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
36170 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
36180 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
36190 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
361a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
361b0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67  atabase page pPg
361c0 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e  ->pgno .  ** can
361d0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
361e0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
361f0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
36200 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
36210 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
36220 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
36230 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21  _NEED_SYNC) && !
36240 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
36250 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
36260 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
36270 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
36280 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
36290 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
362a0 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
362b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
362c0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
362d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
362e0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
362f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
36300 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
36310 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
36320 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
36330 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
36340 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
36350 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
36360 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
36370 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
36380 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
36390 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
363a0 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
363b0 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
363c0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
363d0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
363e0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
363f0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
36400 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64  D_SYNC;.  pPgOld
36410 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
36420 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
36430 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
36440 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
36450 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
36460 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
36470 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
36480 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
36490 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66  ED_SYNC);.    if
364a0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
364b0 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61   /* Do not disca
364c0 72 64 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e  rd pages from an
364d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
364e0 61 73 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67  ase since we mig
364f0 68 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64  ht.      ** need
36500 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74   to rollback lat
36510 65 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74  er.  Just move t
36520 68 65 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74  he page out of t
36530 68 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20  he way. */.     
36540 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36550 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
36560 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
36570 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20  cheMove(pPgOld, 
36580 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31  pPager->dbSize+1
36590 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
365a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
365b0 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20  eDrop(pPgOld);. 
365c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67     }.  }..  orig
365d0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
365e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
365f0 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
36600 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
36610 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
36620 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
36630 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
36640 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
36650 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
36660 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
36670 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
36680 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
36690 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
366a0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
366b0 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
366c0 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
366d0 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
366e0 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
366f0 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
36700 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
36710 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
36720 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
36730 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
36740 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
36750 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
36760 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
36770 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
36780 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
36790 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
367a0 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
367b0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
367c0 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
367d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
367e0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
367f0 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
36800 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
36810 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
36820 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
36830 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
36840 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
36850 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
36860 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
36870 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
36880 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
36890 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
368a0 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
368b0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
368c0 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
368d0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
368e0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
368f0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
36900 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
36910 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
36920 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
36930 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
36940 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
36950 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
36960 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
36970 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
36980 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
36990 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
369a0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
369b0 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
369c0 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
369d0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
369e0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
369f0 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72      */.    PgHdr
36a00 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
36a10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
36a20 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
36a30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
36a40 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
36a50 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
36a60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36a80 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
36a90 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
36aa0 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
36ab0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36ac0 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29  ->pTmpSpace!=0 )
36ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36ae0 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61  3BitvecClear(pPa
36af0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
36b00 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70   needSyncPgno, p
36b10 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
36b20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36b40 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
36b50 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
36b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36b70 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
36b80 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
36b90 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
36ba0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
36bb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
36bc0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
36bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
36be0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
36bf0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
36c00 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
36c10 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73  database, make s
36c20 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ure the original
36c30 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a   page continues.
36c40 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69    ** to exist, i
36c50 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
36c60 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
36c70 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20  roll back.  Use 
36c80 70 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74  pPgOld.  ** as t
36c90 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36ca0 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c   since it has al
36cb0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
36cc0 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ated..  */.  if(
36cd0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71   MEMDB ){.    sq
36ce0 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
36cf0 70 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f  pPgOld, origPgno
36d00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
36d10 67 65 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29  gerUnref(pPgOld)
36d20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
36d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
36d40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
36d50 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
36d60 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
36d70 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
36d80 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
36d90 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
36da0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  age *pPg){.  ass
36db0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
36dc0 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   || pPg->pPager-
36dd0 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75  >memDb );.  retu
36de0 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d  rn pPg->pData;.}
36df0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
36e00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
36e10 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
36e20 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
36e30 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
36e40 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
36e50 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
36e60 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
36e70 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
36e80 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
36e90 65 74 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72  eturn pPg->pExtr
36ea0 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  a;.}../*.** Get/
36eb0 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
36ec0 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
36ed0 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
36ee0 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
36ef0 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
36f00 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
36f10 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
36f20 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
36f30 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
36f40 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
36f50 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
36f60 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
36f70 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
36f80 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
36f90 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
36fa0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
36fb0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
36fc0 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
36fd0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
36fe0 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
36ff0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
37000 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
37010 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
37020 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
37030 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
37040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
37050 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
37060 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
37070 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
37080 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
37090 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
370a0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
370b0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
370c0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
370d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
370e0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
370f0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
37100 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
37110 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
37120 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
37130 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
37140 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
37150 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
37160 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
37170 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
37180 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
37190 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
371a0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
371b0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65  siveMode = (u8)e
371c0 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
371d0 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
371e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
371f0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
37200 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72  journal-mode for
37210 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
37220 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
37230 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  t be one of:.**.
37240 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
37250 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a  NALMODE_DELETE.*
37260 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
37270 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
37280 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
37290 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
372a0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
372b0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20  NALMODE_OFF.**  
372c0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
372d0 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20  ODE_MEMORY.**   
372e0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
372f0 44 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 54 68 65  DE_WAL.**.** The
37300 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 69 73 20   journalmode is 
37310 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
37320 20 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68   specified if th
37330 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f  e change is allo
37340 77 65 64 2e 0a 2a 2a 20 54 68 65 20 63 68 61 6e  wed..** The chan
37350 67 65 20 6d 61 79 20 62 65 20 64 69 73 61 6c 6c  ge may be disall
37360 6f 77 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c  owed for the fol
37370 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a  lowing reasons:.
37380 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e  **.**   *  An in
37390 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
373a0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69   can only have i
373b0 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ts journal_mode 
373c0 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20  set to _OFF.**  
373d0 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a      or _MEMORY..
373e0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 65 6d 70 6f  **.**   *  Tempo
373f0 72 61 72 79 20 64 61 74 61 62 61 73 65 73 20 63  rary databases c
37400 61 6e 6e 6f 74 20 68 61 76 65 20 5f 57 41 4c 20  annot have _WAL 
37410 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e 0a 2a 2a 0a  journalmode..**.
37420 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
37430 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72  indicate the cur
37440 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
37450 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d  pdated) journal-
37460 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
37470 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72  ite3PagerSetJour
37480 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
37490 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
374a0 29 7b 0a 20 20 75 38 20 65 4f 6c 64 20 3d 20 70  ){.  u8 eOld = p
374b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
374c0 64 65 3b 20 20 20 20 2f 2a 20 50 72 69 6f 72 20  de;    /* Prior 
374d0 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f 0a 0a  journalmode */..
374e0 20 20 2f 2a 20 54 68 65 20 65 4d 6f 64 65 20 70    /* The eMode p
374f0 61 72 61 6d 65 74 65 72 20 69 73 20 61 6c 77 61  arameter is alwa
37500 79 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 61 73  ys valid */.  as
37510 73 65 72 74 28 20 20 20 20 20 20 65 4d 6f 64 65  sert(      eMode
37520 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
37530 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
37540 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
37550 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37560 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20  DE_TRUNCATE.    
37570 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
37580 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
37590 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
375a0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
375b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
375c0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
375d0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
375e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
375f0 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
37600 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
37610 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
37620 4d 4f 52 59 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  MORY );..  /* Do
37630 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 6a   not allow the j
37640 6f 75 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61 20  ournalmode of a 
37650 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 74 6f  TEMP database to
37660 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 57   be changed to W
37670 41 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  AL.  */.  if( pP
37680 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
37690 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  & eMode==PAGER_J
376a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
376b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  {.    assert( eO
376c0 6c 64 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld!=PAGER_JOURNA
376d0 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 20 20 20  LMODE_WAL );.   
376e0 20 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20   eMode = eOld;. 
376f0 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6c 6c 6f   }..  /* Do allo
37700 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64  w the journalmod
37710 65 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e of an in-memor
37720 79 20 64 61 74 61 62 61 73 65 20 74 6f 20 62 65  y database to be
37730 20 73 65 74 20 74 6f 0a 20 20 2a 2a 20 61 6e 79   set to.  ** any
37740 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
37750 20 4d 45 4d 4f 52 59 20 6f 72 20 4f 46 46 0a 20   MEMORY or OFF. 
37760 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
37770 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
37780 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  Old==PAGER_JOURN
37790 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
377a0 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55   eOld==PAGER_JOU
377b0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
377c0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 50      if( eMode!=P
377d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
377e0 5f 4d 45 4d 4f 52 59 20 26 26 20 65 4d 6f 64 65  _MEMORY && eMode
377f0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37800 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
37810 20 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20   eMode = eOld;. 
37820 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
37830 65 4d 6f 64 65 21 3d 65 4f 6c 64 20 29 7b 0a 20  eMode!=eOld ){. 
37840 20 20 20 2f 2a 20 57 68 65 6e 20 63 68 61 6e 67     /* When chang
37850 69 6e 67 20 62 65 74 77 65 65 6e 20 72 6f 6c 6c  ing between roll
37860 62 61 63 6b 20 6d 6f 64 65 73 2c 20 63 6c 6f 73  back modes, clos
37870 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
37880 6c 65 20 70 72 69 6f 72 0a 20 20 20 20 2a 2a 20  le prior.    ** 
37890 74 6f 20 74 68 65 20 63 68 61 6e 67 65 2e 20 20  to the change.  
378a0 42 75 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  But when changin
378b0 67 20 66 72 6f 6d 20 61 20 72 6f 6c 6c 62 61 63  g from a rollbac
378c0 6b 20 6d 6f 64 65 20 74 6f 20 57 41 4c 2c 20 6b  k mode to WAL, k
378d0 65 65 70 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a  eep.    ** the j
378e0 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 73 69 6e 63  ournal open sinc
378f0 65 20 74 68 65 72 65 20 69 73 20 61 20 72 6f 6c  e there is a rol
37900 6c 62 61 63 6b 2d 73 74 79 6c 65 20 74 72 61 6e  lback-style tran
37910 73 61 63 74 69 6f 6e 20 69 6e 20 70 6c 61 79 0a  saction in play.
37920 20 20 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 63      ** used to c
37930 6f 6e 76 65 72 74 20 74 68 65 20 76 65 72 73 69  onvert the versi
37940 6f 6e 20 6e 75 6d 62 65 72 73 20 69 6e 20 74 68  on numbers in th
37950 65 20 62 74 72 65 65 20 68 65 61 64 65 72 2e 0a  e btree header..
37960 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
37970 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
37980 64 29 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47  d) && eMode!=PAG
37990 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
379a0 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL ){.      sqli
379b0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
379c0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a  r->jfd);.    }..
379d0 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
379e0 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  e journal mode. 
379f0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  */.    pPager->j
37a00 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
37a10 29 65 4d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20  )eMode;..    /* 
37a20 57 68 65 6e 20 74 72 61 6e 73 69 73 74 69 6f 6e  When transistion
37a30 69 6e 67 20 66 72 6f 6d 20 54 52 55 4e 43 41 54  ing from TRUNCAT
37a40 45 20 6f 72 20 50 45 52 53 49 53 54 20 74 6f 20  E or PERSIST to 
37a50 61 6e 79 20 6f 74 68 65 72 20 6a 6f 75 72 6e 61  any other journa
37a60 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 65 78  l.    ** mode ex
37a70 63 65 70 74 20 57 41 4c 20 28 61 6e 64 20 77 65  cept WAL (and we
37a80 20 61 72 65 20 6e 6f 74 20 69 6e 20 6c 6f 63 6b   are not in lock
37a90 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
37aa0 56 45 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  VE) then .    **
37ab0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
37ac0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  nal file..    */
37ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
37ae0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37af0 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
37b00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37b10 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
37b20 44 45 5f 50 45 52 53 49 53 54 20 26 20 35 29 3d  DE_PERSIST & 5)=
37b30 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
37b40 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37b50 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 35 29  MODE_DELETE & 5)
37b60 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
37b70 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
37b80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 35  LMODE_MEMORY & 5
37b90 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
37ba0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
37bb0 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 35 29 3d  ALMODE_OFF & 5)=
37bc0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
37bd0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37be0 4d 4f 44 45 5f 57 41 4c 20 26 20 35 29 3d 3d 35  MODE_WAL & 5)==5
37bf0 20 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   );..    assert(
37c00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
37c10 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  fd) || pPager->e
37c20 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
37c30 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
37c40 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
37c50 26 20 28 65 4f 6c 64 20 26 20 35 29 3d 3d 31 20  & (eOld & 5)==1 
37c60 26 26 20 28 65 4d 6f 64 65 20 26 20 31 29 3d 3d  && (eMode & 1)==
37c70 30 20 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  0 ){..      /* I
37c80 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 77  n this case we w
37c90 6f 75 6c 64 20 6c 69 6b 65 20 74 6f 20 64 65 6c  ould like to del
37ca0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
37cb0 66 69 6c 65 2e 20 49 66 20 69 74 20 69 73 0a 20  file. If it is. 
37cc0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 70 6f 73 73       ** not poss
37cd0 69 62 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ible, then that 
37ce0 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
37cf0 2e 20 44 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  . Deleting the j
37d00 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
37d10 20 20 2a 2a 20 68 65 72 65 20 69 73 20 61 6e 20    ** here is an 
37d20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
37d30 79 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  y..      **.    
37d40 20 20 2a 2a 20 42 65 66 6f 72 65 20 64 65 6c 65    ** Before dele
37d50 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
37d60 20 66 69 6c 65 2c 20 6f 62 74 61 69 6e 20 61 20   file, obtain a 
37d70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
37d80 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
37d90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
37da0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  s ensures that t
37db0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37dc0 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 20  is not deleted. 
37dd0 20 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 69 74       ** while it
37de0 20 69 73 20 69 6e 20 75 73 65 20 62 79 20 73 6f   is in use by so
37df0 6d 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 2e  me other client.
37e00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37e10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37e20 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  OK;.      int st
37e30 61 74 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ate = pPager->st
37e40 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ate;.      if( s
37e50 74 61 74 65 3c 50 41 47 45 52 5f 53 48 41 52 45  tate<PAGER_SHARE
37e60 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
37e70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
37e80 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
37e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37ea0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
37eb0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
37ec0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
37ed0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
37ee0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
37ef0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
37f00 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
37f10 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
37f20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
37f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
37f50 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
37f60 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
37f70 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
37f80 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
37f90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 74 61  SQLITE_OK && sta
37fa0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
37fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37fc0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
37fd0 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
37fe0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OCK);.      }els
37ff0 65 20 69 66 28 20 73 74 61 74 65 3d 3d 50 41 47  e if( state==PAG
38000 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
38010 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
38020 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
38030 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
38040 20 73 74 61 74 65 3d 3d 70 50 61 67 65 72 2d 3e   state==pPager->
38050 73 74 61 74 65 20 29 3b 0a 20 20 20 20 7d 0a 20  state );.    }. 
38060 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
38070 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
38080 6d 6f 64 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mode */.  return
38090 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
380a0 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
380b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
380c0 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  urrent journal m
380d0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
380e0 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e  te3PagerGetJourn
380f0 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
38100 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
38110 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75  (int)pPager->jou
38120 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  rnalMode;.}../*.
38130 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
38140 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
38150 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20  n a state where 
38160 69 74 20 69 73 20 4f 4b 20 74 6f 20 63 68 61 6e  it is OK to chan
38170 67 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ge the.** journa
38180 6c 6d 6f 64 65 2e 20 20 4a 6f 75 72 6e 61 6c 6d  lmode.  Journalm
38190 6f 64 65 20 63 68 61 6e 67 65 73 20 63 61 6e 20  ode changes can 
381a0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 68 65 6e  only happen when
381b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
381c0 20 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a   is unmodified..
381d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
381e0 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75  gerOkToChangeJou
381f0 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
38200 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
38210 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
38220 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
38230 69 66 28 20 4e 45 56 45 52 28 69 73 4f 70 65 6e  if( NEVER(isOpen
38240 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
38250 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38260 4f 66 66 3e 30 29 20 29 20 72 65 74 75 72 6e 20  Off>0) ) return 
38270 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
38280 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
38290 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75  the size-limit u
382a0 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65  sed for persiste
382b0 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
382c0 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20  ..**.** Setting 
382d0 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74  the size limit t
382e0 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69  o -1 means no li
382f0 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e  mit is enforced.
38300 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74  .** An attempt t
38310 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d  o set a limit sm
38320 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73  aller than -1 is
38330 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34   a no-op..*/.i64
38340 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
38350 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61  rnalSizeLimit(Pa
38360 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34  ger *pPager, i64
38370 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20   iLimit){.  if( 
38380 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20  iLimit>=-1 ){.  
38390 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
383a0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69  lSizeLimit = iLi
383b0 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
383c0 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
383d0 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f  lSizeLimit;.}../
383e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
383f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61  inter to the pPa
38400 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72  ger->pBackup var
38410 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75  iable. The backu
38420 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62  p module.** in b
38430 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e  ackup.c maintain
38440 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
38450 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20   this variable. 
38460 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75  This module.** u
38470 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20  ses it opaquely 
38480 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
38490 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52  o sqlite3BackupR
384a0 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20  estart() and.** 
384b0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
384c0 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  ate() only..*/.s
384d0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a  qlite3_backup **
384e0 73 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b  sqlite3PagerBack
384f0 75 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61  upPtr(Pager *pPa
38500 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26  ger){.  return &
38510 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b  pPager->pBackup;
38520 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
38530 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
38540 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
38550 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
38560 68 65 20 75 73 65 72 20 69 6e 76 6f 6b 65 73 20  he user invokes 
38570 22 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69  "PRAGMA checkpoi
38580 6e 74 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nt"..*/.int sqli
38590 74 65 33 50 61 67 65 72 43 68 65 63 6b 70 6f 69  te3PagerCheckpoi
385a0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
385b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
385c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
385d0 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 20  Pager->pWal ){. 
385e0 20 20 20 75 38 20 2a 7a 42 75 66 20 3d 20 28 75     u8 *zBuf = (u
385f0 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
38600 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
38610 73 71 6c 69 74 65 33 57 61 6c 43 68 65 63 6b 70  sqlite3WalCheckp
38620 6f 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61  oint(pPager->pWa
38630 6c 2c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  l,.        (pPag
38640 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a  er->noSync ? 0 :
38650 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
38660 61 67 73 29 2c 0a 20 20 20 20 20 20 20 20 70 50  ags),.        pP
38670 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
38680 7a 42 75 66 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  zBuf.    );.  }.
38690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
386a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
386b0 57 61 6c 43 61 6c 6c 62 61 63 6b 28 50 61 67 65  WalCallback(Page
386c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
386d0 74 75 72 6e 20 73 71 6c 69 74 65 33 57 61 6c 43  turn sqlite3WalC
386e0 61 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 2d 3e  allback(pPager->
386f0 70 57 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pWal);.}../*.** 
38700 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74