/ Hex Artifact Content
Login

Artifact b4a41030860229e80295fa1f37addab24d21799c:


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: 20 20 75 33 32 20 69 46 72 61 6d 65 3b 20 20 20    u32 iFrame;   
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2670: 2a 20 4c 61 73 74 20 66 72 61 6d 65 20 69 6e 20  * Last frame in 
2680: 57 41 4c 20 77 68 65 6e 20 73 61 76 65 70 6f 69  WAL when savepoi
2690: 6e 74 20 6f 70 65 6e 65 64 20 2a 2f 0a 7d 3b 0a  nt opened */.};.
26a0: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
26b0: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
26c0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
26d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
26e0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64  re..**.** errCod
26f0: 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  e.**.**   Pager.
2700: 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73  errCode may be s
2710: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45  et to SQLITE_IOE
2720: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
2730: 50 54 2c 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53  PT, or.**   or S
2740: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2750: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2760: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2770: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2780: 74 73 0a 2a 2a 20 20 20 61 6e 64 20 69 73 20 72  ts.**   and is r
2790: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
27a0: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
27b0: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
27c0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53  all.  The.**   S
27d0: 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72  QLITE_FULL retur
27e0: 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74  n code is slight
27f0: 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74  ly different. It
2800: 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75   persists only u
2810: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65  ntil the.**   ne
2820: 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f  xt successful ro
2830: 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72  llback is perfor
2840: 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72  med on the pager
2850: 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a   cache. Also,.**
2860: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64     SQLITE_FULL d
2870: 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
2880: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2890: 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
28a0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  PagerLookup().**
28b0: 20 20 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61     APIs, they ma
28c0: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
28d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a  successfully..**
28e0: 0a 2a 2a 20 64 62 53 69 7a 65 56 61 6c 69 64 2c  .** dbSizeValid,
28f0: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2900: 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a  ize, dbFileSize.
2910: 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67  **.**   Managing
2920: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2930: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2940: 6e 20 70 61 67 65 73 20 69 73 20 61 20 6c 69 74  n pages is a lit
2950: 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  tle complicated.
2960: 0a 2a 2a 20 20 20 54 68 65 20 76 61 72 69 61 62  .**   The variab
2970: 6c 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  le Pager.dbSize 
2980: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2990: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
29a0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  t the database.*
29b0: 2a 20 20 20 69 6d 61 67 65 20 63 75 72 72 65 6e  *   image curren
29c0: 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73  tly contains. As
29d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
29e0: 61 67 65 20 67 72 6f 77 73 20 6f 72 20 73 68 72  age grows or shr
29f0: 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20 20 20 76  inks this.**   v
2a00: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
2a10: 65 64 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  ed. The variable
2a20: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
2a30: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
2a40: 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61  umber.**   of pa
2a50: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
2a60: 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 6d  ase file. This m
2a70: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
2a80: 66 72 6f 6d 20 50 61 67 65 72 2e 64 62 53 69 7a  from Pager.dbSiz
2a90: 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d 65 20 70  e.**   if some p
2aa0: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 61  ages have been a
2ab0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
2ac0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 62 75  atabase image bu
2ad0: 74 20 6e 6f 74 20 79 65 74 20 77 72 69 74 74 65  t not yet writte
2ae0: 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20  n.**   out from 
2af0: 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
2b00: 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20   actual file on 
2b10: 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68 65 20  disk. Or if the 
2b20: 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e 0a 2a  image has been.*
2b30: 2a 20 20 20 74 72 75 6e 63 61 74 65 64 20 62 79  *   truncated by
2b40: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
2b50: 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
2b60: 2e 20 54 68 65 20 50 61 67 65 72 2e 64 62 4f 72  . The Pager.dbOr
2b70: 69 67 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  igSize variable.
2b80: 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68  **   contains th
2b90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
2ba0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
2bb0: 65 20 69 6d 61 67 65 20 77 68 65 6e 20 74 68 65  e image when the
2bc0: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72   current.**   tr
2bd0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
2be0: 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e  ened. The conten
2bf0: 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65 65 20  ts of all three 
2c00: 6f 66 20 74 68 65 73 65 20 76 61 72 69 61 62 6c  of these variabl
2c10: 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20  es is.**   only 
2c20: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2c30: 20 63 6f 72 72 65 63 74 20 69 66 20 74 68 65 20   correct if the 
2c40: 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72 2e 64 62  boolean Pager.db
2c50: 53 69 7a 65 56 61 6c 69 64 20 69 73 20 74 72 75  SizeValid is tru
2c60: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a  e..**.**   TODO:
2c70: 20 55 6e 64 65 72 20 77 68 61 74 20 63 6f 6e 64   Under what cond
2c80: 69 74 69 6f 6e 73 20 69 73 20 64 62 53 69 7a 65  itions is dbSize
2c90: 56 61 6c 69 64 20 73 65 74 3f 20 43 6c 65 61 72  Valid set? Clear
2ca0: 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ed?.**.** change
2cb0: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
2cc0: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
2cd0: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2ce0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
2cf0: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
2d00: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
2d10: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
2d20: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
2d30: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
2d40: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
2d50: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
2d60: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
2d70: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
2d80: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
2d90: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
2da0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
2db0: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
2dc0: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
2dd0: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2de0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2df0: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
2e00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e10: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
2e20: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
2e30: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
2e40: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2e50: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
2e60: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2e70: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
2e80: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
2e90: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
2ea0: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
2eb0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
2ec0: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
2ed0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
2ee0: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
2ef0: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f00: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
2f10: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
2f20: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
2f30: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
2f40: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
2f50: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
2f60: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
2f70: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
2f80: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
2f90: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
2fa0: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
2fb0: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
2fc0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
2fd0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62  mitted..**.** db
2fe0: 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20  Modified.**.**  
2ff0: 20 54 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20   The dbModified 
3000: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
3010: 65 76 65 72 20 61 20 64 61 74 61 62 61 73 65 20  ever a database 
3020: 70 61 67 65 20 69 73 20 64 69 72 74 69 65 64 2e  page is dirtied.
3030: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
3040: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
3050: 66 20 65 61 63 68 20 74 72 61 6e 73 61 63 74 69  f each transacti
3060: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69  on..**.**   It i
3070: 73 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d  s used when comm
3080: 69 74 74 69 6e 67 20 6f 72 20 6f 74 68 65 72 77  itting or otherw
3090: 69 73 65 20 65 6e 64 69 6e 67 20 61 20 74 72 61  ise ending a tra
30a0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  nsaction. If.** 
30b0: 20 20 74 68 65 20 64 62 4d 6f 64 69 66 69 65 64    the dbModified
30c0: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
30d0: 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b 20 68 61  hen less work ha
30e0: 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a  s to be done..**
30f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74  .** journalStart
3100: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ed.**.**   This 
3110: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
3120: 65 76 65 72 20 74 68 65 20 74 68 65 20 6d 61 69  ever the the mai
3130: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
3140: 6e 65 64 20 61 6e 64 0a 2a 2a 20 20 20 69 6e 69  ned and.**   ini
3150: 74 69 61 6c 69 7a 65 64 0a 2a 2a 0a 2a 2a 20 20  tialized.**.**  
3160: 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68   The point of th
3170: 69 73 20 66 6c 61 67 20 69 73 20 74 68 61 74 20  is flag is that 
3180: 69 74 20 6d 75 73 74 20 62 65 20 73 65 74 20 61  it must be set a
3190: 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20 66  fter the .**   f
31a0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
31b0: 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c  der in a journal
31c0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
31d0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
31e0: 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20 68  *   After this h
31f0: 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65 77  as happened, new
3200: 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64 20   pages appended 
3210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
3220: 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65 65  .**   do not nee
3230: 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  d the PGHDR_NEED
3240: 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c 20  _SYNC flag set, 
3250: 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6e  as they do not n
3260: 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69 74  eed.**   to wait
3270: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 73   for a journal s
3280: 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79 20  ync before they 
3290: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
32a0: 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64  ut to.**   the d
32b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 65  atabase file (se
32c0: 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72  e function pager
32d0: 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20 20  _write())..**   
32e0: 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a 2a  .** setMaster.**
32f0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
3300: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 65  ble is used to e
3310: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6d  nsure that the m
3320: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
3330: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69 66  le name.**   (if
3340: 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77 72   any) is only wr
3350: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
3360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63 65  ournal file once
3370: 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 63  ..**.**   When c
3380: 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
3390: 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61 73  saction, the mas
33a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
33b0: 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a 2a   name (if any).*
33c0: 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69 74 74  *   may be writt
33d0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
33e0: 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20 74  nal file while t
33f0: 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
3400: 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52 5f  l in.**   PAGER_
3410: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 20 28  RESERVED state (
3420: 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f  see CommitPhaseO
3430: 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61 63 74  ne() for the act
3440: 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74 68  ion). It.**   th
3450: 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  en attempts to u
3460: 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78 63  pgrade to an exc
3470: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66 20  lusive lock. If 
3480: 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a 20  this attempt.** 
3490: 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53 51    fails, then SQ
34a0: 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62 65  LITE_BUSY may be
34b0: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
34c0: 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 75 73   user and the us
34d0: 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74 65  er.**   may atte
34e0: 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
34f0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 67  e transaction ag
3500: 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c 69  ain later (calli
3510: 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50 68  ng.**   CommitPh
3520: 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29 2e  aseOne() again).
3530: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 75 73   This flag is us
3540: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
3550: 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73 74  t the .**   mast
3560: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
3570: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3580: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
3590: 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ile the first.**
35a0: 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50 68     time CommitPh
35b0: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
35c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  ed..**.** doNotS
35d0: 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ync.**.**   When
35e0: 20 65 6e 61 62 6c 65 64 2c 20 63 61 63 68 65 20   enabled, cache 
35f0: 73 70 69 6c 6c 73 20 61 72 65 20 70 72 6f 68 69  spills are prohi
3600: 62 69 74 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  bited and the jo
3610: 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
3620: 74 0a 2a 2a 20 20 20 62 65 20 73 79 6e 63 65 64  t.**   be synced
3630: 2e 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  .  This variable
3640: 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c 65 61   is set and clea
3650: 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  red by sqlite3Pa
3660: 67 65 72 57 72 69 74 65 28 29 20 0a 2a 2a 20 20  gerWrite() .**  
3670: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
3680: 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73  vent a journal s
3690: 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69  ync from happeni
36a0: 6e 67 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ng in between th
36b0: 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 6c 69  e.**   journalli
36c0: 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20  ng of two pages 
36d0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  on the same sect
36e0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  or..**.** needSy
36f0: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a  nc.**.**   TODO:
3700: 20 49 74 20 6d 69 67 68 74 20 62 65 20 65 61 73   It might be eas
3710: 69 65 72 20 74 6f 20 73 65 74 20 74 68 69 73 20  ier to set this 
3720: 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72 69 74  variable in writ
3730: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a  eJournalHdr().**
3740: 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61 73 74     and writeMast
3750: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79  erJournal() only
3760: 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d 65 61  . Change its mea
3770: 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e 63 65  ning to "unsynce
3780: 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61 73 20  d data.**   has 
3790: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
37a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a  the journal"..**
37b0: 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  .** subjInMemory
37c0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73  .**.**   This is
37d0: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61   a boolean varia
37e0: 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68  ble. If true, th
37f0: 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  en any required 
3800: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
3810: 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   is opened as an
3820: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
3830: 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73  al file. If fals
3840: 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72  e, then in-memor
3850: 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e  y.**   sub-journ
3860: 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65  als are only use
3870: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
3880: 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a  pager files..*/.
3890: 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20  struct Pager {. 
38a0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
38b0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs;          /* 
38c0: 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  OS functions to 
38d0: 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20  use for IO */.  
38e0: 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  u8 exclusiveMode
38f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
3900: 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
3910: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58  locking_mode==EX
3920: 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20  CLUSIVE */.  u8 
3930: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20  journalMode;    
3940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f           /* On o
3950: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
3960: 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73  NALMODE_* values
3970: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
3980: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
3990: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
39a0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
39b0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
39c0: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
39e0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
39f0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
3a00: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
3a30: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
3a40: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
3a50: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3a60: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
3a70: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
3a80: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
3a90: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
3aa0: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
3ab0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
3ac0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
3ad0: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
3ae0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
3af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
3b00: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
3b10: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
3b20: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
3b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3b40: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
3b50: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
3b60: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b80: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
3b90: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
3ba0: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
3bb0: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
3bc0: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
3bd0: 65 6d 62 65 72 73 20 74 68 61 74 20 61 72 65 20  embers that are 
3be0: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
3bf0: 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67   modified during
3c00: 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
3c10: 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61  ns. The other va
3c20: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
3c30: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
3c40: 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61  re either consta
3c50: 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68  nt throughout th
3c60: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
3c70: 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65  e pager, or else
3c80: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  .  ** used to st
3c90: 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ore configuratio
3ca0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  n parameters tha
3cb0: 74 20 61 66 66 65 63 74 20 74 68 65 20 77 61 79  t affect the way
3cc0: 20 74 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a   the pager .  **
3cd0: 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a   operates..  **.
3ce0: 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27    ** The 'state'
3cf0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 64 65 73   variable is des
3d00: 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64  cribed in more d
3d10: 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68  etail along with
3d20: 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69   the.  ** descri
3d30: 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61  ptions of the va
3d40: 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65  lues it may take
3d50: 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20   - PAGER_UNLOCK 
3d60: 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65  etc. Many of the
3d70: 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69  .  ** other vari
3d80: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c  ables in this bl
3d90: 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69 62 65  ock are describe
3da0: 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74  d in the comment
3db0: 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20   directly .  ** 
3dc0: 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73  above this class
3dd0: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a   definition..  *
3de0: 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20  /.  u8 state;   
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c  /* PAGER_UNLOCK,
3e10: 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52   _SHARED, _RESER
3e20: 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75  VED, etc. */.  u
3e30: 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20  8 dbModified;   
3e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3e50: 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ue if there are 
3e60: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74  any changes to t
3e70: 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65  he Db */.  u8 ne
3e80: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
3e90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3ea0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
3eb0: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
3ec0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f  urnal */.  u8 jo
3ed0: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
3ee0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3ef0: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
3f00: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
3f10: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
3f20: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
3f30: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
3f40: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
3f50: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
3f60: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f80: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3f90: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3fa0: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3fb0: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fd0: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3fe0: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3ff0: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
4000: 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64 3b   u8 dbSizeValid;
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4020: 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65 20  Set when dbSize 
4030: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20  is correct */.  
4040: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
4050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4060: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
4070: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
4080: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
4090: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
40a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
40b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
40c0: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
40d0: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
40e0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
40f0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
4100: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
4110: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
4120: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4130: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
4140: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
4150: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
4160: 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  t errCode;      
4170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4180: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
4190: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
41a0: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41c0: 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64  Pages journalled
41d0: 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65   since last j-he
41e0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ader written */.
41f0: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4210: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
4220: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
4230: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
4240: 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20   u32 nSubRec;   
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4260: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
4270: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62  s written to sub
4280: 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69  -journal */.  Bi
4290: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
42a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
42b0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
42c0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
42d0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  se file */.  sql
42e0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
42f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4300: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
4310: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
4320: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
4340: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4350: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
4360: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4370: 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *sjfd;         /
4380: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4390: 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  r for sub-journa
43a0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
43b0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
43c0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
43d0: 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ite offset in th
43e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
43f0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
4400: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
4410: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
4420: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
4430: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  al header */.  i
4440: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
4450: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
4460: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
4470: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
4480: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  files */.  Pager
4490: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
44a0: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
44b0: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
44c0: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
44d0: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
44e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
44f0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
4500: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
4510: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
4520: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
4530: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
4540: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
4550: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20  hanges */.  u32 
4560: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
4570: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
4580: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
4590: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
45a0: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
45d0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
45e0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
45f0: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
4600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4610: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
4620: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
4630: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
4640: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4660: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
4670: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
4680: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
4690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
46a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
46b0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
46c0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46e0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
46f0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
4700: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
4710: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
4720: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4730: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
4740: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
4750: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
4760: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4770: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4780: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
4790: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
47a0: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
47b0: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
47c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
47d0: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
47e0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
47f0: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
4800: 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66  andler */.#ifdef
4810: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
4820: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
4830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
4840: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
4850: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
4860: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
4870: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4880: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
4890: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
48a0: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65   void (*xReinite
48b0: 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20  r)(DbPage*); /* 
48c0: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
48d0: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
48e0: 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66   pages */.#ifdef
48f0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4900: 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  C.  void *(*xCod
4910: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
4920: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
4930: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
4940: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
4950: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a  void (*xCodecSiz
4960: 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74  eChng)(void*,int
4970: 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79  ,int); /* Notify
4980: 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68   of page size ch
4990: 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  anges */.  void 
49a0: 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f  (*xCodecFree)(vo
49b0: 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20  id*);           
49c0: 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20    /* Destructor 
49d0: 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f  for the codec */
49e0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b  .  void *pCodec;
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a00: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4a10: 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65   to xCodec... me
4a20: 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  thods */.#endif.
4a30: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
4a40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4a50: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
4a60: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
4a70: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
4a80: 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b  PCache *pPCache;
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4aa0: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63  ointer to page c
4ab0: 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
4ac0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
4ad0: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
4ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
4af0: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
4b00: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20  p processes */. 
4b10: 20 4c 6f 67 20 2a 70 4c 6f 67 3b 20 20 20 20 20   Log *pLog;     
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b30: 4c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  Log used by "jou
4b40: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
4b50: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
4b60: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
4b70: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
4b80: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
4b90: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
4ba0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
4bb0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
4bc0: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
4bd0: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
4be0: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
4bf0: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
4c00: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
4c10: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4c20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4c30: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
4c40: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4c50: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4c60: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
4c70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4c80: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
4c90: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
4ca0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
4cb0: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
4cc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4cd0: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
4ce0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4cf0: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4d00: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
4d10: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4d20: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
4d30: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
4d40: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
4d50: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
4d60: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
4d70: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
4d80: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
4d90: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
4da0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
4db0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
4dc0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
4dd0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
4de0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
4df0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
4e00: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
4e10: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
4e20: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
4e30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
4e40: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
4e50: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
4e60: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
4e70: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
4e80: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
4e90: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
4ea0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
4eb0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
4ec0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
4ed0: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
4ee0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
4ef0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
4f00: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
4f10: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
4f20: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
4f30: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
4f40: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
4f50: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
4f60: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
4f70: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
4f80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
4f90: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
4fa0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
4fb0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
4fc0: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
4fd0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
4fe0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
4ff0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
5000: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
5010: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
5020: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
5030: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
5040: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
5050: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
5060: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
5070: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
5080: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
5090: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
50a0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
50b0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
50c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
50d0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
50e0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
50f0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
5100: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
5110: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
5120: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
5130: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5140: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
5150: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
5160: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
5170: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
5180: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
5190: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
51a0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
51b0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
51c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
51d0: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
51e0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
51f0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
5200: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
5210: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
5220: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
5230: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
5240: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
5250: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
5260: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
5270: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5280: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
5290: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
52a0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
52b0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
52c0: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
52d0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
52e0: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
52f0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
5300: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
5310: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
5320: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
5330: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
5340: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
5350: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
5360: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
5370: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
5380: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
5390: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
53a0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
53b0: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
53c0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
53d0: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
53e0: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
53f0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
5400: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
5410: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
5420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5430: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5440: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
5450: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
5460: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
5470: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
5480: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
5490: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
54a0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
54b0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
54c0: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
54d0: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
54e0: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
54f0: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
5500: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
5510: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
5520: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5540: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
5550: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
5560: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
5570: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
5580: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
5590: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
55a0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
55b0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
55c0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
55d0: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65  47483647..#ifnde
55e0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
55f0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
5600: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
5610: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
5620: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
5630: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
5640: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
5650: 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65  ger){..  /* A te
5660: 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79  mp-file is alway
5670: 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  s in PAGER_EXCLU
5680: 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59  SIVE or PAGER_SY
5690: 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  NCED state. */. 
56a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
56b0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
56c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
56d0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
56e0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  ;..  /* The chan
56f0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
5700: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66   is always set f
5710: 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f  or temp-files */
5720: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5730: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
5740: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
5750: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
5760: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
5770: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
5780: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
5790: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
57a0: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
57b0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
57c0: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
57d0: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
57e0: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
57f0: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
5800: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
5810: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
5820: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
5830: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
5840: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
5850: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
5860: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
5870: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
5880: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
5890: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
58a0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
58b0: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
58c0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
58d0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
58e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
58f0: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
5900: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
5910: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
5920: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
5930: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
5940: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
5950: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
5960: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
5970: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
5980: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
5990: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
59a0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
59b0: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
59c0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
59d0: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
59e0: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
59f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
5a00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5a20: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
5a30: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5a60: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
5a70: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
5a80: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
5a90: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
5aa0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
5ab0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
5ac0: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5ad0: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
5ae0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5af0: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
5b00: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
5b10: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
5b20: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
5b30: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
5b40: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
5b50: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
5b60: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
5b70: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
5b80: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
5b90: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
5ba0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
5bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5bc0: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
5bd0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
5be0: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
5bf0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
5c00: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
5c10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5c20: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
5c30: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
5c40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5c50: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
5c60: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
5c70: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
5c80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5c90: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
5ca0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
5cb0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
5cc0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
5cd0: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
5ce0: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
5cf0: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
5d00: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
5d10: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
5d20: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
5d30: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5d40: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
5d50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
5d60: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
5d70: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
5d80: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d90: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
5da0: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
5db0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5dc0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5dd0: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
5de0: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
5df0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
5e00: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
5e10: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
5e20: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
5e30: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
5e40: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
5e50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
5e60: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
5e70: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
5e80: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
5e90: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
5ea0: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
5eb0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
5ec0: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
5ed0: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
5ee0: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
5ef0: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
5f00: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
5f10: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
5f20: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
5f30: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
5f40: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
5f50: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
5f60: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
5f70: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  ods)../*.** If f
5f80: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
5f90: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
5fa0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
5fb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
5fc0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
5fd0: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
5fe0: 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70  ck){.  if( !isOp
5ff0: 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72  en(pFd) ){.    r
6000: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6010: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
6020: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
6030: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
6040: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6050: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
6060: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
6070: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
6080: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
6090: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
60a0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
60b0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
60c0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
60d0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
60e0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
60f0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6100: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
6110: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
6120: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
6130: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
6140: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
6150: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
6160: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
6170: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
6180: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
6190: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
61a0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
61b0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
61c0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
61d0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
61e0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
61f0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
6200: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
6210: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
6220: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
6230: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
6240: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
6250: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
6260: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
6270: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
6280: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
6290: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
62a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
62b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
62c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
62d0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
62e0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
62f0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
6300: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
6310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
6320: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
6330: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
6340: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
6350: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
6360: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
6370: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
6380: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
63b0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
63c0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
63d0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
63e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
63f0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
6400: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
6430: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
6440: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
6450: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
6460: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
6470: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
6480: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
6490: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
64a0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
64b0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
64c0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
64d0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
64e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
64f0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
6500: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
6510: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
6520: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
6530: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
6540: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
6550: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
6560: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
6570: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
6580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
6590: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
65a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
65b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
65c0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
65d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
65e0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
65f0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
6600: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
6610: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
6620: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
6630: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
6640: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
6650: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
6660: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
6670: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6680: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
6690: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
66a0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
66b0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
66c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
66d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
66e0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
66f0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
6700: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
6710: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
6720: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
6730: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
6740: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
6750: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
6760: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
6770: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
6780: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
6790: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
67a0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
67b0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
67c0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
67d0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
67e0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
67f0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
6800: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6810: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
6820: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
6830: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
6840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
6850: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
6860: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
6870: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
6880: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
6890: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
68a0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
68b0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
68c0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
68d0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
68e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
68f0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
6900: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
6910: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
6920: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
6930: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6940: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
6950: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
6960: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
6970: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6980: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
6990: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
69a0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
69b0: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
69c0: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
69d0: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
69e0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
69f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
6a00: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
6a10: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
6a20: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
6a30: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
6a40: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
6a50: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6a60: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
6a70: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
6a80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
6a90: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
6aa0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
6ab0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
6ac0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
6ad0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6ae0: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
6af0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6b00: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
6b10: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
6b20: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
6b30: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
6b40: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
6b50: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
6b60: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
6b70: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6b80: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
6b90: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
6ba0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
6bb0: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
6bc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6bd0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
6be0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
6bf0: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
6c00: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
6c10: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
6c20: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
6c30: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
6c40: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
6c50: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
6c60: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
6c70: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
6c80: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
6c90: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
6ca0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6cb0: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
6cc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
6cd0: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
6ce0: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
6cf0: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
6d00: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
6d10: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
6d20: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
6d30: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
6d40: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
6d50: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
6d60: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
6d70: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
6d80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6d90: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6da0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
6db0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
6dc0: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
6dd0: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
6de0: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
6df0: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
6e00: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
6e10: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
6e20: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
6e30: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
6e40: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
6e50: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
6e60: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
6e70: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
6e80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6e90: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6ea0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
6eb0: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
6ec0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
6ed0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
6ee0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6ef0: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
6f00: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
6f10: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
6f20: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
6f30: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
6f40: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
6f50: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
6f60: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
6f70: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
6f80: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
6f90: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
6fb0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
6fc0: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
6fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
6fe0: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
6ff0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7000: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
7030: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
7040: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
7050: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
7080: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
7090: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
70a0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
70b0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
70c0: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
70d0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
70e0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
70f0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7100: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7110: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
7120: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
7130: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
7140: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
7150: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
7160: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
7170: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
7180: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
7190: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
71a0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
71b0: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
71c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
71d0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
71e0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
71f0: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
7200: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
7210: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
7220: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
7230: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
7240: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
7250: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
7260: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7270: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7280: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
7290: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
72a0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
72b0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
72c0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
72d0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
72e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
72f0: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
7300: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
7310: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
7320: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
7330: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
7340: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
7350: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
7360: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
7370: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
7380: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
7390: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
73a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
73b0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
73c0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
73d0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
73e0: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
73f0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
7400: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
7410: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
7420: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7430: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
7440: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
7450: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
7460: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
7470: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7490: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
74a0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
74b0: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
74c0: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
74d0: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
74e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
74f0: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
7500: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
7510: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
7520: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
7530: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
7540: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
7550: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
7560: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
7570: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
7580: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
75b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
75c0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
75d0: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
75f0: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
7610: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
7640: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
7650: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
7660: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
7670: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
7680: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
7690: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
76a0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
76b0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
76c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
76d0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
76e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
76f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7700: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
7710: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
7720: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7730: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
7740: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
7750: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7760: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
7770: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
7780: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
7790: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
77a0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
77b0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
77c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
77d0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
77e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
77f0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
7800: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
7810: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
7820: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
7830: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
7840: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
7850: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
7860: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
7870: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
7880: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
7890: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
78a0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
78b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
78c0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
78d0: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
78e0: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
78f0: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
7900: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
7910: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
7920: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
7930: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
7940: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
7950: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
7960: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
7970: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
7980: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
7990: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
79a0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
79b0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
79c0: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
79d0: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
79e0: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
79f0: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
7a00: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
7a10: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
7a20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
7a30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
7a40: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
7a50: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
7a60: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
7a70: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
7a80: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
7a90: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
7aa0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
7ab0: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
7ac0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
7ad0: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
7ae0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
7af0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
7b00: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
7b10: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
7b20: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
7b30: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
7b40: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
7b50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
7b60: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
7b70: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
7b80: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
7b90: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
7ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7bd0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7be0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
7bf0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
7c00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7c10: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
7c20: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
7c30: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
7c40: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7c50: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
7c60: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
7c70: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
7c80: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
7c90: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
7ca0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
7cb0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
7cc0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
7cd0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
7ce0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7cf0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7d00: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
7d10: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
7d20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
7d30: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7d40: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
7d50: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
7d60: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
7d70: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
7d80: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
7d90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7da0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
7db0: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
7dc0: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
7dd0: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
7de0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
7df0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
7e00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
7e10: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
7e20: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
7e30: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
7e40: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
7e50: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
7e60: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
7e70: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
7e80: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
7e90: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
7ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
7eb0: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
7ec0: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
7ed0: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
7ee0: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
7ef0: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
7f00: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
7f10: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
7f20: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
7f30: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
7f40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
7f50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7f60: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
7f70: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
7f80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
7f90: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
7fa0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
7fb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7fc0: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
7fd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
7fe0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
7ff0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
8000: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
8010: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8020: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8030: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8040: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
8050: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
8060: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
8070: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
8080: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
8090: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
80a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
80b0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
80c0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
80d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
80e0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
80f0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
8100: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
8110: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
8120: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
8130: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
8140: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
8150: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
8160: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
8170: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
8180: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
8190: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
81a0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
81b0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
81c0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
81d0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
81e0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
81f0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
8200: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
8210: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
8220: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
8230: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
8240: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
8250: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
8260: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
8270: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
8280: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8290: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
82a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
82b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
82c0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
82d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
82e0: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
82f0: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
8300: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
8310: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
8320: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
8330: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
8340: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
8350: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  ->pageSize;     
8360: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
8370: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
8380: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
8390: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
83c0: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
83d0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8400: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8410: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
8420: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
8430: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
8440: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8450: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
8460: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
8470: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
8480: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
8490: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
84a0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
84b0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
84c0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
84d0: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
84e0: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
84f0: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
8500: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
8510: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
8520: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
8530: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
8540: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
8550: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
8560: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
8570: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
8580: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
8590: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
85a0: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
85b0: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
85c0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
85d0: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
85e0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
85f0: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
8600: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
8610: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
8620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8630: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8640: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a  pPager);..  /* .
8650: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
8660: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
8670: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
8680: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
8690: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
86a0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
86b0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
86c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
86d0: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
86e0: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
86f0: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
8700: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
8710: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
8720: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
8730: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
8740: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
8750: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
8760: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
8770: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
8780: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
8790: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
87a0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
87b0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
87c0: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
87d0: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
87e0: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
87f0: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
8800: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
8810: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
8820: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
8830: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
8840: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
8850: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
8860: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
8870: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
8880: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
8890: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
88a0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
88b0: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
88c0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
88d0: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
88e0: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
88f0: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
8900: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
8910: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
8920: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
8930: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
8940: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
8950: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
8960: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
8970: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
8980: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
8990: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
89a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
89b0: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
89c0: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
89d0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
89e0: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
89f0: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
8a00: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
8a10: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
8a20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
8a30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
8a40: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
8a50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
8a60: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
8a70: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
8a80: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
8a90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8aa0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
8ab0: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
8ac0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
8ad0: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
8ae0: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
8af0: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
8b00: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
8b10: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
8b20: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
8b30: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
8b40: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8b50: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8b60: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
8b70: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
8b80: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
8b90: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
8ba0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
8bb0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
8bc0: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
8bd0: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
8be0: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
8bf0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
8c00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8c10: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
8c20: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
8c30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8c40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8c50: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
8c60: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
8c70: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
8c80: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
8c90: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8ca0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8cb0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
8cc0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
8cd0: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
8ce0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
8cf0: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
8d00: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8d10: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8d20: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
8d30: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
8d40: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
8d50: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
8d60: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8d70: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8d80: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
8d90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8da0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
8db0: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
8dc0: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
8dd0: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
8de0: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
8df0: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
8e00: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
8e10: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
8e20: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
8e30: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
8e40: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
8e50: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
8e60: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
8e70: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
8e80: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
8e90: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
8ea0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
8eb0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8ec0: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
8ed0: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
8ee0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8ef0: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
8f00: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
8f10: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
8f20: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
8f30: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
8f40: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
8f50: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
8f60: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
8f70: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
8f80: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
8f90: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
8fa0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
8fb0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
8fc0: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
8fd0: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
8fe0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
8ff0: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
9000: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
9010: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
9020: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
9030: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
9040: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
9050: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
9060: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
9070: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
9080: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
9090: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
90a0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
90b0: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
90c0: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
90d0: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
90e0: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
90f0: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
9100: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
9110: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
9120: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
9130: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9140: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
9150: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
9160: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
9170: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
9180: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
9190: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
91a0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
91b0: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
91c0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
91d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
91e0: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
91f0: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
9200: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
9210: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
9220: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
9230: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
9240: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9250: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
9260: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
9270: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
9280: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
9290: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
92a0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
92b0: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
92c0: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
92d0: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
92e0: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
92f0: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
9300: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
9310: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9320: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
9330: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
9340: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9350: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
9360: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
9370: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
9380: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9390: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
93a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93b0: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
93c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
93d0: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
93e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
93f0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9400: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9410: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
9420: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
9430: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
9440: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
9450: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
9460: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9470: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9480: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9490: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
94a0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
94b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
94c0: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
94d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
94e0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
94f0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9500: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
9510: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
9520: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9530: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
9540: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
9550: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
9560: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
9570: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
9580: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
9590: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
95a0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
95b0: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
95c0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
95d0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
95e0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
95f0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
9600: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
9610: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9620: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
9630: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9640: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
9650: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
9660: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
9670: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
9680: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
9690: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
96a0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
96b0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
96c0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
96d0: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
96e0: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
96f0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
9700: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
9710: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
9720: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
9730: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
9740: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
9750: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
9760: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
9770: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
9780: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
9790: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
97a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
97b0: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
97c0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
97d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
97e0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
97f0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
9800: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9820: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
9830: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
9840: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
9850: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
9860: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
9870: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
9880: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
9890: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
98a0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
98b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
98c0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
98d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
98e0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
98f0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
9900: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
9910: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
9940: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
9950: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
9960: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9970: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
9980: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
9990: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
99a0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
99b0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
99c0: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
99d0: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
99e0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
99f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
9a00: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
9a10: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
9a20: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
9a30: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
9a40: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
9a50: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
9a60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
9a70: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
9a80: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
9a90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
9aa0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9ab0: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
9ac0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
9ad0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9ae0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9af0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9b00: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
9b10: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
9b20: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
9b30: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
9b40: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
9b50: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
9b60: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
9b70: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
9b80: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
9b90: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
9ba0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
9bb0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
9bc0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
9bd0: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
9be0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
9bf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
9c00: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
9c10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9c20: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9c30: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
9c40: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
9c50: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
9c60: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
9c70: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
9c80: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9c90: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
9ca0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
9cb0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
9cc0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
9cd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9ce0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
9cf0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
9d00: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
9d10: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
9d20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
9d30: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
9d40: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
9d50: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
9d60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
9d70: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
9d80: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
9d90: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
9da0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
9db0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
9dc0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
9dd0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
9de0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
9df0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9e00: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
9e10: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9e20: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9e30: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9e40: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
9e50: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
9e60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9e70: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9e80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9e90: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
9ea0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
9eb0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
9ec0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9ed0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
9ee0: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
9ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
9f00: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
9f10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9f20: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
9f30: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
9f40: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
9f50: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
9f60: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
9f70: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
9f80: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
9f90: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
9fa0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
9fb0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
9fc0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
9fd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
9fe0: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
9ff0: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
a000: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a010: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
a020: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a030: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
a040: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
a050: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
a060: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a070: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
a080: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
a090: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
a0a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a0b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
a0c0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
a0d0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
a0e0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
a0f0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
a100: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
a110: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
a120: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
a130: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
a140: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
a150: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
a160: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a170: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
a180: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
a190: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
a1a0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
a1b0: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
a1c0: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
a1d0: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
a1e0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
a1f0: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
a200: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
a210: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
a220: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
a230: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
a240: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
a250: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
a260: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
a270: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
a280: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
a290: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
a2a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a2b0: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
a2c0: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
a2d0: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
a2e0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
a2f0: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
a300: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
a310: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
a320: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
a330: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
a340: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
a350: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
a360: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
a370: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
a380: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
a390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
a3a0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
a3b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a3c0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
a3d0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a3e0: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
a3f0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
a400: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a410: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
a420: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
a430: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
a440: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
a450: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
a460: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
a470: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
a480: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
a490: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
a4a0: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
a4b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
a4c0: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
a4d0: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
a4e0: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
a4f0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
a500: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
a510: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a520: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
a530: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
a540: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
a550: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
a560: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
a570: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
a580: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
a590: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a5a0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a5b0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a5c0: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
a5d0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
a5e0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
a5f0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
a600: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
a610: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
a620: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
a630: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
a640: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
a650: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a660: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a670: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a680: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a690: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
a6a0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
a6b0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
a6c0: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
a6d0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
a6e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a6f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a700: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a710: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a720: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a730: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a740: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a750: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a760: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a770: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a780: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a790: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a7a0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a7b0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a7c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a7d0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a7e0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a7f0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a800: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a810: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a820: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a830: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a840: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a850: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
a860: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
a870: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
a880: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
a890: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
a8a0: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
a8b0: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
a8c0: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
a8d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
a8e0: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
a8f0: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
a900: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
a910: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a920: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
a930: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
a940: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
a950: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
a960: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
a970: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
a980: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
a990: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
a9a0: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
a9b0: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
a9c0: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
a9d0: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
a9e0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
a9f0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
aa00: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
aa10: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
aa20: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
aa30: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
aa40: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
aa50: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
aa60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
aa70: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
aa80: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
aa90: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
aac0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
aad0: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
aae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
aaf0: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
ab00: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
ab10: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ab30: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
ab40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
ab50: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
ab60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ab70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ab80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
ab90: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
aba0: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
abc0: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
abd0: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
abe0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
abf0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
ac00: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
ac10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ac20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ac30: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
ac40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ac50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ac60: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
ac70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ac80: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
ac90: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
aca0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
acb0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
acc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
acd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
ace0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
acf0: 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
ad00: 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
ad10: 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
ad20: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
ad30: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
ad40: 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
ad50: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
ad60: 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
ad70: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
ad80: 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
ad90: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
ada0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
adb0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
adc0: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
add0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
ade0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
adf0: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
ae00: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
ae10: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
ae20: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
ae30: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
ae40: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
ae50: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
ae60: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
ae70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ae80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
ae90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
aea0: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
aeb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
aec0: 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
aed0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aee0: 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
aef0: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
af00: 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
af10: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
af20: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
af30: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
af40: 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
af50: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
af60: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
af70: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
af80: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
af90: 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
afa0: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
afb0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
afc0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
afd0: 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
afe0: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
aff0: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
b000: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
b010: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
b020: 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
b030: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
b040: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
b050: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
b060: 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
b070: 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
b080: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b090: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b0a0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
b0b0: 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
b0c0: 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
b0d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
b0e0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
b0f0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
b100: 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61  aster+20);.  pPa
b110: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
b120: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
b130: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
b140: 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
b150: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
b160: 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
b170: 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
b180: 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
b190: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
b1a0: 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
b1b0: 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
b1c0: 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
b1d0: 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
b1e0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
b1f0: 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
b200: 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
b210: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
b220: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
b230: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b240: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
b250: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
b260: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
b270: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
b280: 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
b290: 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
b2a0: 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
b2b0: 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
b2c0: 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
b2d0: 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
b2e0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
b2f0: 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
b300: 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
b310: 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
b320: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
b330: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b340: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
b350: 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
b360: 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
b370: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
b380: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b390: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b3a0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
b3b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
b3c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
b3e0: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
b3f0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
b400: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65   page number. Re
b410: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
b420: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
b430: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71   NULL if the req
b440: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
b450: 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  ot .** already i
b460: 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  n memory..*/.sta
b470: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
b480: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
b490: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
b4a0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
b4d0: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20   value */..  /* 
b4e0: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
b4f0: 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f  le for a call to
b500: 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77   PcacheFetch() w
b510: 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
b520: 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20  0 to.  ** fail, 
b530: 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74  since no attempt
b540: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e   to allocate dyn
b550: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  amic memory will
b560: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
b570: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63   (void)sqlite3Pc
b580: 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
b590: 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
b5a0: 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72   0, &p);.  retur
b5b0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
b5c0: 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
b5d0: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b5e0: 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  , discard all in
b5f0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49  -memory pages. I
b600: 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69  f.** the pager i
b610: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b620: 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
b630: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
b640: 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e  ** TODO: Why can
b650: 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68   we not reset th
b660: 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e  e pager while in
b670: 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f   error state?.*/
b680: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b690: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b6a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53  pPager){.  if( S
b6b0: 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72  QLITE_OK==pPager
b6c0: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b6d0: 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
b6e0: 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
b6f0: 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69  ackup);.    sqli
b700: 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
b710: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
b720: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
b730: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
b740: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
b750: 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
b760: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
b770: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
b780: 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
b790: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b7a0: 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
b7b0: 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
b7c0: 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
b7d0: 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
b7e0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
b7f0: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
b800: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
b810: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b820: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
b830: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b840: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
b850: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
b860: 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
b870: 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
b880: 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
b890: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
b8a0: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
b8b0: 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
b8c0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
b8d0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b8e0: 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
b8f0: 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
b900: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
b910: 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
b920: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
b930: 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
b940: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
b950: 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
b960: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
b970: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
b980: 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
b990: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
b9a0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
b9b0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
b9c0: 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
b9d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
b9e0: 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
b9f0: 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
ba00: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
ba10: 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
ba20: 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
ba30: 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
ba40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
ba50: 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
ba60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
ba70: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
ba80: 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
ba90: 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
baa0: 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
bab0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
bac0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
bad0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bae0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
baf0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
bb00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bb10: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bb20: 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
bb30: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
bb40: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
bb50: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
bb60: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
bb70: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
bb80: 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
bb90: 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
bba0: 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
bbb0: 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
bbc0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
bbd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bbe0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
bbf0: 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
bc00: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
bc10: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
bc20: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
bc30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bc40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bc50: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
bc60: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
bc70: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
bc80: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
bc90: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
bca0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
bcb0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
bcc0: 74 20 70 61 67 65 72 55 73 65 4c 6f 67 28 50 61  t pagerUseLog(Pa
bcd0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
bce0: 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e  return (pPager->
bcf0: 70 4c 6f 67 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pLog!=0);.}../*.
bd00: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bd10: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
bd20: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bd30: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
bd40: 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c  er.** is in excl
bd50: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
bd60: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
bd70: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
bd80: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
bd90: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
bda0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
bdb0: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
bdc0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
bdd0: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
bde0: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
bdf0: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
be00: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
be10: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
be20: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
be30: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
be40: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
be50: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
be60: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
be70: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
be80: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
be90: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
bea0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
beb0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
bec0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
bed0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
bee0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
bef0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bf00: 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
bf10: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
bf20: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f     /* Always clo
bf30: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
bf40: 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
bf50: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
bf60: 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65  ock..    ** Othe
bf70: 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63  rwise, another c
bf80: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
bf90: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
bfa0: 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  te might.    ** 
bfb0: 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  delete the file 
bfc0: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
bfd0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  s..    */.    sq
bfe0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
bff0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73  ger->jfd);.    s
c000: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
c010: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
c020: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
c030: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
c040: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
c050: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
c060: 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
c070: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
c080: 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79  locked, somebody
c090: 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e   else might chan
c0a0: 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a  ge it. The.    *
c0b0: 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  * values stored 
c0c0: 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  in Pager.dbSize 
c0d0: 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d  etc. might becom
c0e0: 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20  e invalid if.   
c0f0: 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73   ** this happens
c100: 2e 20 20 4f 6e 65 20 63 61 6e 20 61 72 67 75 65  .  One can argue
c110: 20 74 68 61 74 20 74 68 69 73 20 64 6f 65 73 6e   that this doesn
c120: 27 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  't need to be cl
c130: 65 61 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74  eared.    ** unt
c140: 69 6c 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  il the change-co
c150: 75 6e 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c  unter check fail
c160: 73 20 69 6e 20 50 61 67 65 72 53 68 61 72 65 64  s in PagerShared
c170: 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2a 20 43  Lock()..    ** C
c180: 6c 65 61 72 69 6e 67 20 74 68 65 20 70 61 67 65  learing the page
c190: 20 73 69 7a 65 20 63 61 63 68 65 20 68 65 72 65   size cache here
c1a0: 20 69 73 20 62 65 69 6e 67 20 63 6f 6e 73 65 72   is being conser
c1b0: 76 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  vative..    */. 
c1c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
c1d0: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20  eValid = 0;..   
c1e0: 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67   if( pagerUseLog
c1f0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
c200: 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
c210: 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72  eSnapshot(pPager
c220: 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 7d 65 6c  ->pLog);.    }el
c230: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  se{.      rc = o
c240: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
c250: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
c260: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
c270: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
c280: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
c290: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
c2a0: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
c2b0: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a  pPager))..    /*
c2c0: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
c2d0: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
c2e0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
c2f0: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
c300: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
c310: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
c320: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
c330: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
c340: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
c350: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
c360: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
c370: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
c380: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
c390: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
c3a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
c3b0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
c3c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c3d0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
c3e0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
c3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
c400: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
c410: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
c420: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
c430: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  tDone = 0;.    p
c440: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
c450: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
c460: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
c470: 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ied = 0;.  }.}..
c480: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c490: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
c4a0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45  lled when an IOE
c4b0: 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46  RR, CORRUPT or F
c4c0: 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79  ULL error.** may
c4d0: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20   have occurred. 
c4e0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
c4f0: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
c500: 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a  to the pager .**
c510: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
c520: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
c530: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
c540: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
c550: 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75  pager .** API fu
c560: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75  nction. The valu
c570: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
c580: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
c590: 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  nd argument .** 
c5a0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
c5b0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
c5c0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
c5d0: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
c5e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
c5f0: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
c600: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
c610: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
c620: 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69   Until the persi
c630: 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c  sten error is cl
c640: 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71  eared,.** subseq
c650: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
c660: 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c  n this Pager wil
c670: 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
c680: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a  turn the same .*
c690: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  * error code..**
c6a0: 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74  .** A persistent
c6b0: 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73   error indicates
c6c0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
c6d0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
c6e0: 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
c6f0: 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
c700: 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
c710: 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
c720: 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
c730: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
c740: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
c750: 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
c760: 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
c770: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
c780: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
c790: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
c7a0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
c7b0: 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
c7c0: 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
c7d0: 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
c7e0: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
c7f0: 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
c800: 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
c810: 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
c820: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
c830: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
c840: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
c850: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
c860: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
c870: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
c880: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
c890: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
c8a0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
c8b0: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
c8c0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c8d0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
c8e0: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
c8f0: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
c900: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
c910: 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
c920: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
c930: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
c940: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
c950: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
c960: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c970: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
c980: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
c990: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
c9a0: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
c9b0: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
c9c0: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
c9d0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
c9e0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
c9f0: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
ca00: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
ca10: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
ca20: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
ca30: 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
ca40: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
ca50: 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
ca60: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
ca70: 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
ca80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
ca90: 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
caa0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
cab0: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
cac0: 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d  state. If this m
cad0: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
cae0: 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
caf0: 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
cb00: 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
cb10: 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   next connection
cb20: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
cb30: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
cb40: 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
cb50: 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
cb60: 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74   will.** roll it
cb70: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
cb80: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
cb90: 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
cba0: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
cbb0: 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
cbc0: 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
cbd0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
cbe0: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
cbf0: 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
cc00: 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
cc10: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
cc20: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68   error state. Wh
cc30: 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
cc40: 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
cc50: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
cc60: 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
cc70: 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
cc80: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
cc90: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
cca0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ccb0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
ccc0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
ccd0: 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
cce0: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
ccf0: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
cd00: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
cd10: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
cd20: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
cd30: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
cd40: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
cd50: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
cd60: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
cd70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
cd80: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
cd90: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
cda0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
cdb0: 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
cdc0: 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
cdd0: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
cde0: 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
cdf0: 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
ce00: 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
ce10: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
ce20: 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
ce30: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
ce40: 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
ce50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ce60: 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
ce70: 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
ce80: 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
ce90: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
cea0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
ceb0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
cec0: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
ced0: 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  or PAGER_UNLOCK 
cee0: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
cef0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
cf00: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
cf10: 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c  -op (returns SQL
cf20: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK)..**.** O
cf30: 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
cf40: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
cf50: 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
cf60: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
cf70: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
cf80: 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
cf90: 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
cfa0: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
cfb0: 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
cfc0: 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
cfd0: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
cfe0: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
cff0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
d000: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
d010: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
d020: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
d030: 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
d040: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
d050: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
d060: 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
d070: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
d080: 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
d090: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
d0a0: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
d0b0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d0c0: 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
d0d0: 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
d0e0: 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
d0f0: 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
d100: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d110: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
d120: 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
d130: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
d140: 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
d150: 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
d160: 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
d170: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
d180: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
d190: 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
d1a0: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
d1b0: 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
d1c0: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
d1d0: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
d1e0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
d1f0: 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
d200: 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
d210: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
d220: 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
d230: 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
d240: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
d250: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
d260: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
d270: 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
d280: 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
d290: 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
d2a0: 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
d2b0: 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
d2c0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
d2d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
d2e0: 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
d2f0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
d300: 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
d310: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
d320: 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
d330: 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
d340: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
d350: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d360: 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
d370: 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
d380: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d390: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
d3a0: 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
d3b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
d3c0: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
d3d0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
d3e0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
d3f0: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
d400: 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
d410: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
d420: 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
d430: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
d440: 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
d450: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69   is finalized, i
d460: 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
d470: 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  -exclusive mode,
d480: 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f   the.** pager mo
d490: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ves to PAGER_SHA
d4a0: 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64  RED state (and d
d4b0: 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f  owngrades the lo
d4c0: 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ck on the.** dat
d4d0: 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
d4e0: 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49  dingly)..**.** I
d4f0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
d500: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
d510: 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20  ive mode and is 
d520: 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  in PAGER_SYNCED 
d530: 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76  state,.** it mov
d540: 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  es to PAGER_EXCL
d550: 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20  USIVE. No locks 
d560: 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77  are downgraded w
d570: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a  hen running in.*
d580: 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  * exclusive mode
d590: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
d5a0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
d5b0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
d5c0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
d5d0: 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
d5e0: 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
d5f0: 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
d600: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
d610: 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
d620: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
d630: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
d640: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
d650: 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
d660: 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
d670: 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
d680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d690: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
d6a0: 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
d6b0: 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
d6c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d6d0: 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
d6e0: 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
d6f0: 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
d700: 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
d710: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
d720: 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
d730: 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
d740: 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
d750: 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
d760: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
d770: 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
d780: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
d790: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
d7a0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
d7b0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
d7c0: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
d7d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d7e0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
d7f0: 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
d800: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
d810: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
d820: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
d830: 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
d840: 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
d850: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
d860: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
d870: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
d880: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
d890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d8a0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
d8b0: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
d8c0: 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ger);..  assert(
d8d0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
d8e0: 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
d8f0: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
d900: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
d910: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
d920: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
d930: 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29  UseLog(pPager) )
d940: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
d950: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
d960: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
d970: 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
d980: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  nal(pPager->jfd)
d990: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d9a0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d9b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
d9c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
d9d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d9e0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
d9f0: 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
da00: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
da10: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
da20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
da30: 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
da40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da50: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
da60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
da70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
da80: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
da90: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
daa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
dab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
dac0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
dad0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
dae0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
daf0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
db00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
db10: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
db20: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
db30: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
db40: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
db50: 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ST.    ){.      
db60: 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
db70: 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
db80: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61  aster);.      pa
db90: 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
dba0: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
dbb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
dbc0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
dbd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
dbe0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
dbf0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
dc00: 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
dc10: 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
dc20: 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
dc30: 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
dc40: 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
dc50: 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
dc60: 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
dc70: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
dc80: 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
dc90: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
dca0: 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
dcb0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
dcc0: 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
dcd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
dce0: 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
dcf0: 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
dd00: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
dd10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
dd20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
dd30: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
dd40: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
dd50: 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
dd60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
dd70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
dd80: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
dd90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
dda0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
ddb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ddc0: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
ddd0: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
dde0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
ddf0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
de00: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
de10: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
de20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
de30: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
de40: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
de50: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
de60: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
de70: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
de80: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
de90: 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
dea0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
deb0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
dec0: 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  sh);.#endif.  }.
ded0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
dee0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
def0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
df00: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
df10: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
df20: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
df30: 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
df40: 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
df50: 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  e);..  if( pager
df60: 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29  UseLog(pPager) )
df70: 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  {.    rc2 = sqli
df80: 74 65 33 57 61 6c 57 72 69 74 65 4c 6f 63 6b 28  te3WalWriteLock(
df90: 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 30 29  pPager->pLog, 0)
dfa0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
dfb0: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
dfc0: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
dfd0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
dfe0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
dff0: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
e000: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
e010: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
e020: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
e030: 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61  _SHARED;.    pPa
e040: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
e050: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Done = 0;.  }els
e060: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
e070: 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
e080: 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  D ){.    pPager-
e090: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
e0a0: 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20  XCLUSIVE;.  }.  
e0b0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
e0c0: 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
e0d0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
e0e0: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
e0f0: 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  ied = 0;..  /* T
e100: 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74  ODO: Is this opt
e110: 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65  imal? Why is the
e120: 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64   db size invalid
e130: 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20  ated here .  ** 
e140: 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  when the databas
e150: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e  e file is not un
e160: 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61  locked? */.  pPa
e170: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
e180: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
e190: 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
e1a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
e1b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
e1c0: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
e1d0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
e1e0: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  eValid = 0;.  }.
e1f0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
e200: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
e210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
e220: 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
e230: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
e240: 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
e250: 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
e260: 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
e270: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
e280: 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
e290: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
e2a0: 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
e2b0: 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
e2c0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
e2d0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
e2e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
e2f0: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
e300: 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
e310: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
e320: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
e330: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
e340: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e350: 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
e360: 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
e370: 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
e380: 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
e390: 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
e3a0: 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
e3b0: 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
e3c0: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
e3d0: 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
e3e0: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
e3f0: 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
e400: 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
e410: 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
e420: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
e430: 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
e440: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
e450: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
e460: 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
e470: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
e480: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
e490: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
e4a0: 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
e4b0: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
e4c0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
e4d0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
e4e0: 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
e4f0: 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
e500: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
e510: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
e520: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
e530: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
e540: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
e550: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
e560: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
e570: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
e580: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
e590: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
e5a0: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
e5b0: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
e5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
e5d0: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
e5e0: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
e5f0: 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
e600: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
e610: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
e620: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
e630: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
e640: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
e650: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
e660: 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
e670: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
e680: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
e690: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
e6a0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
e6b0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
e6c0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
e6d0: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
e6e0: 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
e6f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e700: 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
e710: 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
e720: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
e730: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
e740: 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
e750: 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
e760: 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
e770: 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
e780: 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
e790: 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
e7a0: 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
e7b0: 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
e7c0: 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
e7d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
e7e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69  .**.** The isMai
e7f0: 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72  nJrnl flag is tr
e800: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
e810: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
e820: 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66  journal and.** f
e830: 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61  alse for the sta
e840: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
e850: 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
e860: 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a  ck journal uses.
e870: 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  ** checksums - t
e880: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e890: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  rnal does not..*
e8a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
e8b0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
e8c0: 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
e8d0: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
e8e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
e8f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
e900: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
e910: 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
e920: 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
e930: 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
e940: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
e950: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
e960: 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
e970: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
e980: 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
e990: 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
e9a0: 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
e9b0: 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
e9c0: 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
e9d0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
e9e0: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
e9f0: 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
ea00: 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
ea10: 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
ea20: 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
ea30: 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
ea40: 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
ea50: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
ea60: 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
ea70: 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
ea80: 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
ea90: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
eaa0: 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
eab0: 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
eac0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
ead0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
eae0: 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
eaf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
eb00: 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
eb10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
eb20: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
eb30: 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
eb40: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
eb50: 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
eb60: 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
eb70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
eb80: 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
eb90: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
eba0: 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
ebb0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
ebc0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
ebd0: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
ebe0: 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
ebf0: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
ec00: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
ec10: 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
ec20: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
ec30: 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
ec40: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
ec50: 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
ec60: 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
ec70: 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
ec80: 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
ec90: 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
eca0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
ecb0: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
ecc0: 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
ecd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
ece0: 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
ecf0: 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
ed00: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
ed10: 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
ed20: 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
ed30: 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
ed40: 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
ed50: 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
ed60: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
ed70: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
ed80: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
ed90: 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
eda0: 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
edb0: 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
edc0: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
edd0: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
ede0: 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
edf0: 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
ee00: 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
ee10: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
ee20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
ee30: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
ee40: 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
ee50: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
ee60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ee70: 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
ee80: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
ee90: 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eeb0: 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
eec0: 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
eed0: 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
ef00: 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
ef10: 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
ef20: 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
ef30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
ef40: 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
ef50: 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
ef60: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
ef70: 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
ef80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
ef90: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
efa0: 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
efb0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
efc0: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
efd0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
efe0: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
eff0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
f000: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
f010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f020: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
f030: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
f040: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
f050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f060: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
f070: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
f080: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
f090: 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0b0: 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
f0c0: 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
f0d0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
f0e0: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
f0f0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
f100: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
f110: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
f120: 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
f150: 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
f160: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
f170: 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
f180: 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
f190: 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
f1a0: 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
f1b0: 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
f1c0: 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
f1d0: 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
f1e0: 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
f1f0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
f200: 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
f210: 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
f220: 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
f230: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
f240: 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
f250: 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
f260: 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
f270: 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
f280: 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
f290: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
f2a0: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
f2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
f2c0: 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
f2d0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
f2e0: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
f2f0: 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 4c  ssert( pagerUseL
f300: 6f 67 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  og(pPager)==0 ||
f310: 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
f320: 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
f330: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
f340: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
f350: 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
f360: 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
f370: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
f380: 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
f390: 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
f3a0: 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
f3b0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
f3c0: 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
f3d0: 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
f3e0: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
f3f0: 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
f400: 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
f410: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
f420: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f430: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
f440: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
f450: 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
f460: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
f470: 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
f480: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
f490: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
f4a0: 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
f4b0: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
f4c0: 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
f4d0: 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
f4e0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
f4f0: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
f500: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
f510: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
f520: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
f530: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
f540: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
f550: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
f560: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
f570: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
f580: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
f590: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
f5a0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
f5b0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
f5c0: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
f5d0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
f5e0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
f5f0: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
f600: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
f610: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
f620: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
f630: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
f640: 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
f650: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
f660: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
f670: 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
f680: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
f690: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
f6a0: 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
f6b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f6c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f6d0: 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
f6e0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
f6f0: 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
f700: 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
f710: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
f720: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
f730: 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
f740: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
f750: 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
f760: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
f770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
f780: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
f790: 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72   if( pDone && (r
f7a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
f7b0: 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  cSet(pDone, pgno
f7c0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f7d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
f7e0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
f7f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
f800: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
f810: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
f820: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
f830: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
f840: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
f850: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
f860: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
f870: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
f880: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
f890: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
f8a0: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
f8b0: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
f8c0: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
f8d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
f8e0: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
f8f0: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
f900: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
f910: 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
f920: 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
f930: 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
f940: 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
f950: 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
f960: 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
f970: 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
f980: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
f990: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
f9a0: 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
f9b0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
f9c0: 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
f9d0: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
f9e0: 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
f9f0: 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
fa00: 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
fa10: 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
fa20: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
fa30: 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
fa40: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
fa50: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
fa60: 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
fa70: 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
fa80: 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
fa90: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
faa0: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
fab0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
fac0: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
fad0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
fae0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
faf0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
fb00: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
fb10: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
fb20: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
fb30: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
fb40: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
fb50: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
fb60: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
fb70: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
fb80: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
fb90: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
fba0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
fbb0: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
fbc0: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
fbd0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
fbe0: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
fbf0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
fc00: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
fc10: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
fc20: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
fc30: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
fc40: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
fc50: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
fc60: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
fc70: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
fc80: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
fc90: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
fca0: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
fcb0: 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
fcc0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
fcd0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
fce0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
fcf0: 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
fd00: 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
fd10: 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
fd20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
fd30: 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
fd40: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
fd50: 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
fd60: 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
fd70: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
fd80: 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
fd90: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
fda0: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
fdb0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
fdc0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
fdd0: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
fde0: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
fdf0: 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
fe00: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
fe10: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
fe20: 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
fe30: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
fe40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
fe50: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
fe60: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
fe70: 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
fe80: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
fe90: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
fea0: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20  Sync==0..  **.  
feb0: 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20  ** 2008-04-14:  
fec0: 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  When attempting 
fed0: 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72  to vacuum a corr
fee0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
fef0: 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  e, it.  ** is po
ff00: 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61  ssible to fail a
ff10: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20   statement on a 
ff20: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f  database that do
ff30: 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
ff40: 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  ..  ** Do not at
ff50: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69  tempt to write i
ff60: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
ff70: 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f  has never been o
ff80: 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  pened..  */.  if
ff90: 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50  ( pagerUseLog(pP
ffa0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67  ager) ){.    pPg
ffb0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
ffc0: 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
ffd0: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
ffe0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  no);.  }.  asser
fff0: 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42  t( pPg || !MEMDB
10000 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
10010 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
10020 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
10030 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
10040 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
10050 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
10060 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
10070 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
10080 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
10090 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
100a0 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
100b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
100c0 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
100d0 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
100e0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
100f0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
10100 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
10110 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
10120 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
10130 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
10140 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
10150 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
10160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 50 61  ;.  }.  if( (pPa
10170 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
10180 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  R_EXCLUSIVE).   
10190 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
101a0 2d 3e 66 64 29 0a 20 20 20 26 26 20 69 73 53 79  ->fd).   && isSy
101b0 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36  nced.  ){.    i6
101c0 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
101d0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
101e0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73  ageSize;.    tes
101f0 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e  tcase( !isSavepn
10200 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28  t && pPg!=0 && (
10210 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
10220 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
10230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
10240 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
10250 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
10260 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10270 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61  ager->fd, (u8*)a
10280 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
10290 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20  geSize, ofst);. 
102a0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
102b0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
102c0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
102d0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
102e0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  o;.    }.    if(
102f0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
10300 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31   ){.      CODEC1
10310 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
10320 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
10330 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20  TE_NOMEM);.     
10340 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
10350 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
10360 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
10370 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43  )aData);.      C
10380 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44  ODEC2(pPager, aD
10390 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63  ata, pgno, 7, rc
103a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61  =SQLITE_NOMEM, a
103b0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
103c0 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
103d0 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
103e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
103f0 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
10400 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
10410 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
10420 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
10430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
10440 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
10450 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
10460 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
10470 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
10480 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
10490 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
104a0 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
104b0 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
104c0 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
104d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
104e0 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
104f0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
10500 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
10510 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
10520 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
10530 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
10540 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
10550 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
10560 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
10570 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
10580 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
10590 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
105a0 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
105b0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
105c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
105d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
105e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
105f0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
10600 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
10610 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
10620 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
10630 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
10640 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
10650 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
10660 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
10670 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
10680 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
10690 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
106a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
106b0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
106c0 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
106d0 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
106e0 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
106f0 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
10700 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
10710 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
10720 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
10730 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
10740 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
10750 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
10760 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72  nt );.    if( (r
10770 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10780 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
10790 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21  pgno, &pPg, 1))!
107a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
107b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
107c0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c     }.    pPg->fl
107d0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
107e0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
107f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
10800 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
10810 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
10820 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
10830 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
10840 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
10850 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
10860 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
10870 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
10880 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
10890 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
108a0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
108b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
108c0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
108d0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
108e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
108f0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
10900 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
10910 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
10920 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
10930 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
10940 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10950 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
10960 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
10970 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
10980 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
10990 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
109a0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
109b0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
109c0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
109d0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
109e0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
109f0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
10a00 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
10a10 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
10a20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
10a30 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
10a40 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
10a50 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
10a60 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
10a70 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
10a80 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
10a90 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
10aa0 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
10ab0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
10ac0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
10ad0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
10ae0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
10af0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
10b00 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
10b10 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
10b20 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
10b30 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
10b40 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
10b50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
10b60 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
10b70 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
10b80 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
10b90 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
10ba0 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
10bb0 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
10bc0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
10bd0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
10be0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
10bf0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
10c00 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
10c10 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
10c20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
10c30 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
10c40 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
10c50 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
10c60 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
10c70 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
10c80 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
10c90 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
10ca0 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
10cb0 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
10cc0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
10cd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
10ce0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
10cf0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
10d00 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
10d10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
10d20 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
10d30 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
10d40 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
10d50 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
10d60 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
10d70 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
10d80 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
10d90 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
10da0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
10db0 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
10dc0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
10dd0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
10de0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
10df0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
10e00 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
10e10 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
10e20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
10e30 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
10e40 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
10e50 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
10e60 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
10e70 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
10e80 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
10e90 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
10ea0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
10eb0 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
10ec0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10ed0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
10ee0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66  (pPg);.    }.#if
10ef0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
10f00 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
10f10 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
10f20 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
10f30 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
10f40 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
10f50 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
10f60 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
10f70 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
10f80 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
10f90 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
10fa0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
10fb0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
10fc0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
10fd0 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
10fe0 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
10ff0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
11000 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
11010 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
11020 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
11030 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
11040 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
11050 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
11060 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
11070 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69  NOMEM);.    sqli
11080 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
11090 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
110a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
110b0 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
110c0 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
110d0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
110e0 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
110f0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
11100 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
11110 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
11120 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
11130 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
11140 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
11150 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
11160 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
11170 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
11180 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11190 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
111a0 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
111b0 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
111c0 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
111d0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
111e0 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
111f0 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
11200 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
11210 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
11220 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
11230 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11240 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
11250 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
11260 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
11270 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
11280 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
11290 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
112a0 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
112b0 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
112c0 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
112d0 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
112e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
112f0 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
11300 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
11310 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
11320 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
11330 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
11340 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
11350 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
11360 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
11370 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
11380 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
11390 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
113a0 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
113b0 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
113c0 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
113d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
113e0 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
113f0 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
11400 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
11410 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
11420 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
11430 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
11440 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
11450 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
11460 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
11470 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
11480 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
11490 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
114a0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
114b0 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
114c0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
114d0 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
114e0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
114f0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
11500 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
11510 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
11520 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
11530 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
11540 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
11550 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
11560 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
11570 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
11580 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
11590 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
115a0 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
115b0 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
115c0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
115d0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
115e0 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
115f0 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
11600 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
11610 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
11620 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
11630 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
11640 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
11650 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
11660 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
11670 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
11680 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
11690 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
116a0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
116b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
116c0 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
116d0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
116e0 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
116f0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
11700 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
11710 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
11720 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
11730 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
11740 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
11750 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11760 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
11770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
11780 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
11790 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
117a0 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
117b0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
117c0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
117d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
117e0 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
117f0 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
11800 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
11810 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
11820 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
11830 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
11840 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
11850 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
11860 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
11870 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
11880 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
11890 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
118a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
118b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
118c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
118d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
118e0 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
118f0 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
11900 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
11910 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
11920 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
11930 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
11940 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
11950 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
11960 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
11970 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
11980 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
11990 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
119a0 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
119b0 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
119c0 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
119d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a  ournal file */..
119e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
119f0 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
11a00 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
11a10 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
11a20 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
11a30 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
11a40 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11a50 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
11a60 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
11a70 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
11a80 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
11a90 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
11aa0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
11ab0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
11ac0 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
11ad0 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
11ae0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
11af0 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
11b00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11b10 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
11b20 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
11b30 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
11b40 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
11b50 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
11b60 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
11b70 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
11b80 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11b90 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
11ba0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
11bb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
11bc0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
11bd0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
11be0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
11bf0 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
11c00 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
11c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11c20 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11c30 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
11c40 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
11c50 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
11c60 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
11c70 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e  rPtr = 0;.    in
11c80 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70  t nMasterPtr = p
11c90 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
11ca0 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  1;..    /* Load 
11cb0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
11cc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
11cd0 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
11ce0 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
11cf0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
11d00 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
11d10 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
11d20 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  . .    */.    zM
11d30 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
11d40 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e  qlite3Malloc((in
11d50 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
11d60 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20   + nMasterPtr + 
11d70 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  1);.    if( !zMa
11d80 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
11d90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11da0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
11db0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
11dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73  ;.    }.    zMas
11dd0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
11de0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
11df0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 20 20  Journal+1];.    
11e00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
11e10 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
11e20 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
11e30 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
11e40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
11e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11e60 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11e70 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11e80 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
11e90 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 7a 4a  al] = 0;..    zJ
11ea0 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
11eb0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
11ec0 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
11ed0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
11ee0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
11ef0 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74 73        int exists
11f00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11f10 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
11f20 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
11f30 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
11f40 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
11f50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11f60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11f70 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
11f80 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
11f90 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
11fa0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
11fb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
11fc0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
11fd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11fe0 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
11ff0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
12000 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
12010 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
12020 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
12030 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
12040 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
12050 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
12060 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
12070 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12080 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt c;.        in
12090 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
120a0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
120b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
120c0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
120d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
120e0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
120f0 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
12100 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
12110 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12130 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
12140 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
12150 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
12160 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
12170 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
12180 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
12190 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
121a0 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
121b0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
121c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
121d0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
121e0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
121f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
12200 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
12210 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d  r[0]!=0 && strcm
12220 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
12230 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
12240 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
12250 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
12260 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
12270 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
12280 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
12290 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
122a0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
122b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
122c0 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
122d0 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
122e0 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
122f0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
12300 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
12310 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
12320 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
12330 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
12340 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
12350 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12360 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
12370 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
12380 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
12390 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
123a0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
123b0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
123c0 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20  ournal) );.  }. 
123d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
123e0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
123f0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
12400 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12410 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
12420 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
12430 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
12440 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
12450 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
12460 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
12470 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
12480 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
12490 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
124a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
124b0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
124c0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
124d0 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
124e0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
124f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
12500 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  n, or an exclusi
12510 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a  ve lock is not.*
12520 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  * held, this fun
12530 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
12540 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
12550 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
12560 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20  e is.** changed 
12570 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
12580 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
12590 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49  geSize bytes). I
125a0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e  f the file.** on
125b0 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
125c0 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
125d0 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
125e0 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
125f0 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
12600 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
12610 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
12620 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  might might be t
12630 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
12640 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
12650 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
12660 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
12670 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
12680 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
12690 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
126a0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
126b0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
126c0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
126d0 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
126e0 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
126f0 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
12700 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
12710 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
12720 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
12730 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
12740 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
12750 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
12760 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
12770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
12780 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
12790 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
127a0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
127b0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
127c0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
127d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
127e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
127f0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
12800 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12810 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
12820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12830 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
12840 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
12850 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  VE && isOpen(pPa
12860 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
12870 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
12880 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a   newSize;.    /*
12890 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
128a0 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
128b0 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
128c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
128d0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
128e0 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
128f0 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
12900 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
12910 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
12920 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
12930 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
12940 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
12950 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
12960 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
12970 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
12980 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
12990 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
129a0 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
129b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
129c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
129d0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
129e0 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
129f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12a00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12a10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
12a20 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
12a30 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
12a40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
12a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12a60 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
12a70 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
12a80 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
12a90 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
12aa0 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
12ab0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
12ac0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
12ad0 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
12ae0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
12af0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
12b00 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
12b10 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a   be used used .*
12b20 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
12b30 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
12b40 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
12b50 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
12b60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
12b70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
12b80 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
12b90 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
12ba0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
12bb0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
12bc0 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
12bd0 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
12be0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
12bf0 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
12c00 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
12c10 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
12c20 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
12c30 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
12c40 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
12c50 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
12c60 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
12c70 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
12c80 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
12c90 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
12ca0 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
12cb0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
12cc0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
12cd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
12ce0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
12cf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
12d00 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
12d10 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
12d20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
12d30 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
12d40 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
12d50 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
12d60 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
12d70 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
12d80 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
12d90 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
12da0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
12db0 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
12dc0 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
12dd0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
12de0 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
12df0 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
12e00 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
12e10 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
12e20 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
12e30 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
12e40 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
12e50 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67  e<32 ){.    pPag
12e60 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
12e70 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   512;.  }.  if( 
12e80 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12e90 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
12ea0 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
12eb0 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
12ec0 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50  E>=512 );.    pP
12ed0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12ee0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
12ef0 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
12f00 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
12f10 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
12f20 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
12f30 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
12f40 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
12f50 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
12f60 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
12f70 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
12f80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
12f90 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
12fa0 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
12fb0 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
12fc0 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
12fd0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
12fe0 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
12ff0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
13000 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13010 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
13020 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
13030 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
13040 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
13050 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
13060 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
13070 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
13080 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
13090 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
130a0 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
130b0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
130c0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
130d0 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
130e0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
130f0 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
13100 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
13110 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
13120 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
13130 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
13140 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
13150 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
13160 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
13170 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
13180 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
13190 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
131a0 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
131b0 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
131c0 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
131d0 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
131e0 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
131f0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
13200 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
13210 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
13220 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
13230 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
13240 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
13250 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
13260 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
13270 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
13280 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
13290 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
132a0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
132b0 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
132c0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
132d0 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
132e0 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
132f0 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
13300 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
13310 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
13320 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
13330 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
13340 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
13350 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
13360 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
13370 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
13380 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
13390 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
133a0 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
133b0 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
133c0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
133d0 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
133e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
133f0 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
13400 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
13410 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
13420 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
13430 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
13440 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
13450 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
13460 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
13470 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13480 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
13490 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
134a0 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
134b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
134c0 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
134d0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
134e0 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
134f0 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
13500 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
13510 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
13520 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
13530 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
13540 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
13550 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
13560 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
13570 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
13580 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
13590 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
135a0 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
135b0 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
135c0 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
135d0 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
135e0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
135f0 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
13600 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
13610 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
13620 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
13630 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
13640 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
13650 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
13660 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
13670 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
13680 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
13690 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
136a0 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
136b0 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
136c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
136d0 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
136e0 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
136f0 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
13700 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
13710 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
13720 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
13730 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13740 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
13750 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
13760 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
13770 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
13780 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
13790 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
137a0 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
137b0 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
137c0 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
137d0 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
137e0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
137f0 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
13800 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
13810 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
13820 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
13830 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
13840 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
13850 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
13860 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
13870 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
13880 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
13890 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
138a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
138b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
138c0 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
138d0 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
138e0 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
138f0 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
13900 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
13910 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
13920 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
13930 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
13940 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
13950 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
13960 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
13970 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
13980 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
13990 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
139a0 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
139b0 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
139c0 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
139d0 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
139e0 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
139f0 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
13a00 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
13a10 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
13a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a30 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
13a40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13a50 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
13a60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
13a70 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
13a80 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
13a90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13aa0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13ab0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
13ac0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13ae0 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
13af0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
13b00 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13b20 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
13b30 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
13b40 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
13b50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
13b60 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
13b70 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
13b80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
13b90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
13ba0 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
13bb0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13bc0 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
13bd0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
13be0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
13bf0 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
13c00 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
13c10 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
13c20 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
13c30 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
13c40 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
13c50 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
13c60 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
13c70 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
13c80 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
13c90 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  k */..  /* Figur
13ca0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
13cb0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
13cc0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
13cd0 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
13ce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
13cf0 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
13d00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13d10 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
13d20 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
13d30 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
13d40 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
13d50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
13d60 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
13d70 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
13d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
13d90 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13da0 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
13db0 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
13dc0 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
13dd0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
13de0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
13df0 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
13e00 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
13e10 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
13e20 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
13e30 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
13e40 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
13e50 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
13e60 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
13e70 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
13e80 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
13e90 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
13ea0 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
13eb0 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
13ec0 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
13ed0 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
13ee0 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
13ef0 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
13f00 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
13f10 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
13f20 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
13f30 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
13f40 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
13f50 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
13f60 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
13f70 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
13f80 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
13f90 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
13fa0 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
13fb0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
13fc0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
13fd0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
13fe0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
13ff0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
14000 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14010 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
14020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14030 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
14040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14050 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
14060 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
14070 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
14080 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
14090 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
140a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
140b0 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
140c0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
140d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
140e0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
140f0 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
14100 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
14110 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
14120 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
14130 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
14140 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
14150 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
14160 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
14170 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
14180 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
14190 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
141a0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
141b0 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
141c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
141d0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
141e0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
141f0 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
14200 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
14210 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
14220 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
14230 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
14240 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
14250 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
14260 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
14270 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
14280 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
14290 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
142a0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
142b0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
142c0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
142d0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
142e0 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
142f0 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
14300 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
14310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
14320 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14330 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14340 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14350 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
14360 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14370 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
14380 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
14390 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
143a0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
143b0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
143c0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
143d0 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
143e0 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
143f0 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
14400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14410 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
14420 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
14430 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
14440 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
14450 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
14460 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
14470 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
14480 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
14490 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
144a0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
144b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
144c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
144d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
144e0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
144f0 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
14500 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
14510 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
14520 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
14530 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
14540 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
14550 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
14560 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
14570 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
14580 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
14590 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
145a0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
145b0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
145c0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
145d0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
145e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
145f0 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
14600 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
14610 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
14620 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
14630 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
14640 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
14650 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
14660 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
14670 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
14680 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
14690 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
146a0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
146b0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
146c0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
146d0 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
146e0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
146f0 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
14700 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
14710 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
14720 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
14730 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
14740 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
14750 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
14760 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
14770 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
14780 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
14790 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
147a0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
147b0 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
147c0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
147d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
147e0 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
147f0 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
14800 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
14810 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
14820 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
14830 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
14840 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
14850 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
14860 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
14870 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
14880 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
14890 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
148a0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
148b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
148c0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
148d0 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
148e0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
148f0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
14900 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
14910 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
14920 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14930 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
14940 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
14950 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
14960 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
14970 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
14980 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
14990 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
149a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
149b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
149c0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
149d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
149e0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
149f0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
14a00 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
14a10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14a20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
14a30 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
14a40 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14a50 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
14a60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
14a70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
14a80 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
14a90 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
14aa0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
14ab0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
14ac0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
14ad0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
14ae0 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
14af0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
14b00 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
14b10 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
14b20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14b30 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
14b40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14b50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
14b60 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
14b70 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
14b80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
14b90 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
14ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14bb0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14bc0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
14bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14be0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
14bf0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14c00 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
14c10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14c20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
14c30 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
14c40 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
14c50 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
14c60 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
14c70 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
14c80 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
14c90 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
14ca0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
14cb0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
14cc0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
14cd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
14ce0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
14cf0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
14d00 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
14d10 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
14d20 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
14d30 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
14d40 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
14d50 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
14d60 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
14d70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
14d80 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
14d90 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
14da0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
14db0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
14dc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
14de0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
14df0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14e00 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
14e10 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
14e20 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
14e30 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
14e40 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
14e50 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
14e60 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
14e70 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
14e80 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
14e90 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
14ea0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
14eb0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
14ec0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
14ed0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
14ee0 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
14ef0 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
14f00 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
14f10 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
14f20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14f30 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14f40 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
14f60 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
14f70 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
14f80 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
14f90 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
14fa0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
14fb0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
14fc0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
14fd0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
14fe0 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
14ff0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
15000 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
15010 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
15020 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
15030 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
15040 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
15050 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
15060 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
15070 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15080 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
15090 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  fied..  */.  ass
150a0 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d  ert(.    pPager-
150b0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30  >fd->pMethods==0
150c0 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ||.    sqlite3O
150d0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
150e0 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
150f0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
15100 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a  D,0)>=SQLITE_OK.
15110 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68    );..  /* If th
15120 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
15130 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
15140 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
15150 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
15160 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
15170 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
15180 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
15190 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
151a0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
151b0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
151c0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
151d0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
151e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
151f0 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
15200 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
15210 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
15220 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
15230 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
15240 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
15250 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
15260 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
15270 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
15280 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
15290 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
152a0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
152b0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
152c0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
152d0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
152e0 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
152f0 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
15300 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
15310 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
15320 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
15330 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
15340 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
15350 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
15360 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
15370 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
15380 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
15390 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
153a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
153b0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
153c0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
153d0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
153e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
153f0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
15400 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
15410 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
15420 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
15430 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
15440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15450 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
15460 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
15470 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
15480 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
15490 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
154a0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
154b0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
154c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
154d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
154e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
154f0 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
15500 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
15510 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
15520 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
15530 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
15540 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
15550 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15570 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15580 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
15590 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
155a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
155b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
155c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
155d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
155e0 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
155f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
15600 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
15610 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
15620 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
15630 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
15640 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
15650 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
15660 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
15670 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
15680 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
15690 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
156a0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
156b0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
156c0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
156d0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
156e0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
156f0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
15700 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
15710 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
15720 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
15730 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
15740 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
15750 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
15760 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
15770 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
15780 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
15790 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
157a0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
157b0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
157c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
157d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
157e0 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
157f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15800 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
15810 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
15820 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
15830 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
15840 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15850 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
15860 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15870 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
15880 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
15890 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
158a0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
158b0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
158c0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
158d0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
158e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
158f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
15900 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
15910 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
15920 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
15930 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
15940 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
15950 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
15960 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
15970 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
15980 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
15990 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
159a0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
159b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
159c0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
159d0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
159e0 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
159f0 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
15a00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
15a10 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
15a20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
15a30 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73  e */.  i64 iOffs
15a40 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
15a50 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
15a60 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65  et of file to re
15a70 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
15a80 20 69 73 49 6e 4c 6f 67 20 3d 20 30 3b 20 20 20   isInLog = 0;   
15a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15aa0 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20  e if page is in 
15ab0 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  log file */..  a
15ac0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
15ad0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
15ae0 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ED && !MEMDB );.
15af0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
15b00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
15b10 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73  .  if( NEVER(!is
15b20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
15b30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
15b40 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
15b50 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
15b60 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
15b70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15b80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15b90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
15ba0 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70  f( pagerUseLog(p
15bb0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
15bc0 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65   Try to pull the
15bd0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77   page from the w
15be0 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20  rite-ahead log. 
15bf0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
15c00 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65  te3WalRead(pPage
15c10 72 2d 3e 70 4c 6f 67 2c 20 70 67 6e 6f 2c 20 26  r->pLog, pgno, &
15c20 69 73 49 6e 4c 6f 67 2c 20 70 50 67 2d 3e 70 44  isInLog, pPg->pD
15c30 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ata);.  }.  if( 
15c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15c50 20 21 69 73 49 6e 4c 6f 67 20 29 7b 0a 20 20 20   !isInLog ){.   
15c60 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
15c70 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
15c80 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
15c90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
15ca0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
15cb0 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72  g->pData, pPager
15cc0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66  ->pageSize, iOff
15cd0 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
15ce0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
15cf0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
15d00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
15d10 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
15d20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
15d30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
15d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
15d50 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
15d60 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
15d70 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
15d80 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
15d90 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
15da0 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
15db0 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
15dc0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
15dd0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
15de0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
15df0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
15e00 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
15e10 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
15e20 20 7a 65 72 6f 2e 20 20 42 79 74 65 73 20 33 32   zero.  Bytes 32
15e30 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 20  ..35 and 35..39 
15e40 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
15e50 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
15e60 0a 20 20 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  .      ** never 
15e70 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
15e80 66 69 6c 6c 69 6e 67 20 70 50 61 67 65 72 2d 3e  filling pPager->
15e90 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
15ea0 68 20 61 6c 6c 20 30 78 66 66 0a 20 20 20 20 20  h all 0xff.     
15eb0 20 2a 2a 20 62 79 74 65 73 20 73 68 6f 75 6c 64   ** bytes should
15ec0 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
15ed0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
15ee0 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
15ef0 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
15f00 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
15f10 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
15f20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
15f30 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
15f40 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
15f50 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
15f60 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
15f70 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75  hite noising equ
15f80 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f  aling 16 bytes o
15f90 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68  f 0xff is vanish
15fa0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20  ingly small so. 
15fb0 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c       ** we shoul
15fc0 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20  d still be ok.. 
15fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65       */.      me
15fe0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46  mset(pPager->dbF
15ff0 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73  ileVers, 0xff, s
16000 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
16010 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
16020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
16030 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
16040 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
16050 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  [24];.      memc
16060 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
16070 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
16080 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
16090 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
160a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44  .    }.  }.  COD
160b0 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
160c0 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c  >pData, pgno, 3,
160d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
160e0 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  EM);..  PAGER_IN
160f0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
16100 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
16110 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
16120 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
16130 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
16140 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16150 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
16160 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
16170 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
16180 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
16190 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
161a0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
161b0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
161c0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
161d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
161e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
161f0 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
16200 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
16210 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
16220 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16230 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
16240 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
16250 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16260 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
16270 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
16280 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
16290 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
162a0 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
162b0 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
162c0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
162d0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
162e0 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
162f0 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
16300 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
16310 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
16320 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
16330 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
16340 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
16350 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
16360 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
16370 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
16380 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
16390 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
163a0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
163b0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
163c0 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
163d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
163e0 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
163f0 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
16400 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16410 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
16420 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
16430 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16440 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
16450 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
16460 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
16470 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
16480 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
16490 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
164a0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
164b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
164c0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
164d0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
164e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
164f0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
16500 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
16510 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
16520 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
16530 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
16540 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
16550 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16570 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
16580 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
16590 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
165a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
165b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
165c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
165d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
165e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
165f0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
16600 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
16610 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
16620 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
16630 62 61 63 6b 4c 6f 67 28 50 61 67 65 72 20 2a 70  backLog(Pager *p
16640 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
16650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16670 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
16680 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
166a0 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
166b0 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
166c0 2f 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  /..  /* Normally
166d0 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  , if a transacti
166e0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
166f0 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72  k, any backup pr
16700 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a  ocesses are.  **
16710 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61   updated as data
16720 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   is copied out o
16730 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
16740 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20  ournal and into 
16750 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16760 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  e. This is not g
16770 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c  enerally possibl
16780 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74  e with a WAL dat
16790 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72  abase, as.  ** r
167a0 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73  ollback involves
167b0 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69   simply truncati
167c0 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  ng the log file.
167d0 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f   Therefore, if o
167e0 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20  ne.  ** or more 
167f0 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65  frames have alre
16800 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
16810 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64   to the log (and
16820 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a   therefore .  **
16830 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74   also copied int
16840 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74  o the backup dat
16850 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20  abases) as part 
16860 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
16870 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61  ion,.  ** the ba
16880 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65  ckups must be re
16890 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
168a0 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 44 69  if( sqlite3WalDi
168b0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67  rty(pPager->pLog
168c0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
168d0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
168e0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
168f0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c    }..  /* For al
16900 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
16910 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
16920 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
16930 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
16940 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
16950 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
16960 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
16970 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
16980 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
16990 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
169a0 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
169b0 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
169c0 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
169d0 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
169e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
169f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
16a00 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
16a10 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
16a20 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
16a30 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
16a40 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
16a50 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70  (pPager->pLog, p
16a60 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
16a70 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
16a80 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
16a90 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
16aa0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
16ab0 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
16ac0 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
16ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
16ae0 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
16af0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
16b00 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
16b10 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
16b20 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
16b30 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
16b40 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
16b50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16b60 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
16b70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
16b80 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
16b90 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
16ba0 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
16bb0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
16bc0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
16bd0 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
16be0 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
16bf0 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
16c00 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
16c10 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
16c20 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
16c30 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
16c40 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
16c50 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
16c60 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
16c70 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
16c80 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
16c90 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
16ca0 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
16cb0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
16cc0 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
16cd0 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
16ce0 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
16cf0 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
16d00 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
16d10 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
16d20 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
16d30 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
16d40 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
16d50 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
16d60 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
16d70 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
16d80 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
16d90 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
16da0 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
16db0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
16dc0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
16dd0 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
16de0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
16df0 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
16e00 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
16e10 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
16e20 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
16e30 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
16e40 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
16e50 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
16e60 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
16e70 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
16e80 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
16e90 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
16ea0 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
16eb0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
16ec0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
16ed0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
16ee0 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
16ef0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
16f00 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
16f10 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
16f20 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
16f30 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
16f40 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
16f50 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
16f60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
16f80 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
16f90 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
16fa0 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
16fb0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
16fc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
16fd0 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
16fe0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
16ff0 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
17000 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
17010 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
17020 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
17030 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
17040 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
17050 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
17060 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
17070 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
17080 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
17090 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
170a0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
170b0 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
170c0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
170d0 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
170e0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
170f0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
17100 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
17110 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
17120 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
17130 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
17140 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
17150 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
17160 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
17170 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
17180 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
17190 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
171a0 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
171b0 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
171c0 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
171d0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
171e0 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
171f0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
17200 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
17210 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
17220 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
17230 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
17240 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
17250 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17260 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
17270 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
17280 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
17290 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
172a0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
172b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
172c0 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
172e0 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
172f0 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
17300 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
17310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17320 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
17330 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
17340 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
17350 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
17360 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
17370 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
17380 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
17390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
173a0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
173b0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
173c0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
173d0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
173e0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
173f0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
17400 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
17410 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
17420 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
17430 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
17440 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
17450 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
17460 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
17470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17480 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
17490 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
174a0 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
174b0 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
174c0 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
174d0 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
174e0 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
174f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
17500 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
17510 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
17520 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
17530 7a 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76  ze;..  if( !pSav
17540 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55  epoint && pagerU
17550 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29 7b  seLog(pPager) ){
17560 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
17570 72 52 6f 6c 6c 62 61 63 6b 4c 6f 67 28 70 50 61  rRollbackLog(pPa
17580 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
17590 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
175a0 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
175b0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
175c0 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
175d0 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
175e0 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
175f0 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
17600 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
17610 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
17620 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
17630 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
17640 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
17650 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
17660 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
17670 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
17680 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
17690 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
176a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61  >journalOff;.  a
176b0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 4c  ssert( pagerUseL
176c0 6f 67 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  og(pPager)==0 ||
176d0 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a   szJ==0 );..  /*
176e0 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
176f0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
17700 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
17710 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
17720 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
17730 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
17740 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
17750 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
17760 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
17770 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
17780 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
17790 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
177a0 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
177b0 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
177c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
177d0 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
177e0 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
177f0 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
17800 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
17810 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
17820 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
17830 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
17840 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
17850 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
17860 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67  avepoint && !pag
17870 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
17880 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
17890 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
178a0 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
178b0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
178c0 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
178d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
178e0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
178f0 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
17900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17910 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
17920 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
17930 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
17940 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
17950 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
17960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
17970 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
17980 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17990 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
179a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
179b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
179c0 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
179d0 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
179e0 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
179f0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
17a00 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
17a10 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
17a20 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
17a30 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
17a40 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
17a50 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
17a60 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
17a70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
17a80 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
17a90 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
17aa0 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
17ab0 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
17ac0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
17ad0 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
17ae0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
17af0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
17b00 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
17b10 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
17b20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17b30 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
17b40 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
17b50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
17b60 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
17b70 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
17b80 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
17b90 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
17ba0 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c   0, szJ, &nJRec,
17bb0 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73   &dummy);.    as
17bc0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
17bd0 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  _DONE );..    /*
17be0 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61  .    ** The "pPa
17bf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
17c00 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
17c10 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
17c20 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20  journalOff".    
17c30 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74  ** test is relat
17c40 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35  ed to ticket #25
17c50 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73  65.  See the dis
17c60 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  cussion in the. 
17c70 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79     ** pager_play
17c80 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
17c90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17ca0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
17cb0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  */.    if( nJRec
17cc0 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
17cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
17ce0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
17cf0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
17d00 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
17d10 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
17d20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
17d30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
17d40 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
17d50 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
17d60 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
17d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
17d80 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
17d90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
17da0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
17db0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
17dc0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
17dd0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
17de0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
17df0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
17e00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
17e10 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
17e20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
17e30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
17e40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73  r->journalOff==s
17e50 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
17e60 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
17e70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
17e80 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
17e90 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
17ea0 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
17eb0 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
17ec0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
17ed0 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
17ee0 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
17ef0 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
17f00 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
17f10 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
17f20 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
17f30 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
17f40 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
17f50 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17f60 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
17f70 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69  ffset = pSavepoi
17f80 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
17f90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17fa0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
17fb0 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29  UseLog(pPager) )
17fc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
17fd0 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
17fe0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 4c 6f  Undo(pPager->pLo
17ff0 67 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  g, pSavepoint->i
18000 46 72 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Frame);.    }.  
18010 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
18020 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
18030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
18040 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
18050 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
18060 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
18070 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
18080 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
18090 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
180a0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
180b0 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
180c0 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
180d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
180e0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
180f0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
18100 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
18110 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
18120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18130 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18140 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
18150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18160 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
18170 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
18180 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
18190 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
181a0 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
181b0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
181c0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
181d0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
181e0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
181f0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
18200 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
18210 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
18220 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
18230 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
18240 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
18250 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
18260 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
18270 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
18280 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
18290 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
182a0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
182b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
182c0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
182d0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
182e0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
182f0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
18300 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
18310 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
18320 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
18330 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
18340 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
18350 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
18360 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
18370 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
18380 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
18390 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
183a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
183b0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
183c0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
183d0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
183e0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
183f0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
18400 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
18410 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
18420 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
18430 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
18440 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
18450 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
18460 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
18470 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18480 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
18490 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
184a0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
184b0 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
184c0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
184d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
184e0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
184f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
18500 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
18510 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
18520 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
18530 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
18540 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
18550 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
18560 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
18570 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
18580 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
18590 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
185a0 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
185b0 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
185c0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
185d0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
185e0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
185f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18600 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
18610 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
18620 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
18630 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
18640 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
18650 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
18660 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
18670 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
18680 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
18690 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
186a0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
186b0 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
186c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
186d0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
186e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
186f0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
18700 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
18710 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
18720 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18730 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
18740 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
18750 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
18760 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
18770 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
18780 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
18790 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
187a0 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
187b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
187c0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
187d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
187e0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
187f0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
18800 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
18810 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
18820 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
18830 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
18840 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
18850 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
18860 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
18870 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
18880 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
18890 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
188a0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
188b0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
188c0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
188d0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
188e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
188f0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
18900 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
18910 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
18920 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
18930 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18940 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
18950 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
18960 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
18970 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
18980 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
18990 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
189a0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
189b0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
189c0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
189d0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
189e0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
189f0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
18a00 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
18a10 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
18a20 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
18a30 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
18a40 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
18a50 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
18a60 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
18a70 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
18a80 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
18a90 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
18aa0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
18ab0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
18ac0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
18ad0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18ae0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
18af0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
18b00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
18b10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
18b20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
18b30 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
18b40 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
18b50 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
18b60 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
18b70 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
18b80 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
18b90 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
18ba0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
18bb0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
18bc0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
18bd0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
18be0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
18bf0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
18c00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
18c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18c20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
18c30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
18c40 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
18c50 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
18c60 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
18c70 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
18c80 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
18c90 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
18ca0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
18cb0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
18cc0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
18cd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18ce0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
18cf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
18d00 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
18d10 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
18d20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
18d30 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
18d40 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
18d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
18d60 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
18d70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18d80 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
18d90 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
18da0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
18db0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
18dc0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
18dd0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
18de0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
18df0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
18e00 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
18e10 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
18e20 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
18e30 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
18e40 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
18e50 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
18e60 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
18e70 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
18e80 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
18e90 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
18ea0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
18eb0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
18ec0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
18ed0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
18ee0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
18ef0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
18f00 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
18f10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
18f20 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
18f30 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
18f40 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
18f50 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
18f60 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
18f70 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
18f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
18fb0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
18fc0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
18fd0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
18fe0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
18ff0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
19000 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
19010 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
19020 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
19030 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
19040 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
19050 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
19060 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
19070 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
19080 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
19090 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
190a0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
190b0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
190c0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
190d0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
190e0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
190f0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
19100 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
19110 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
19120 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
19130 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
19140 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
19170 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
19180 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
19190 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
191a0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
191b0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
191c0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
191d0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
191e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
191f0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
19200 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
19210 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
19220 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
19230 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
19240 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
19250 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
19260 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
19270 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
19280 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
19290 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
192a0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
192b0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
192c0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
192d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
192e0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
192f0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
19300 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
19310 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
19320 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
19330 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
19340 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
19350 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
19360 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
19390 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
193a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
193b0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
193c0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
193d0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
193e0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
193f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
19400 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
19410 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
19420 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
19430 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
19440 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
19450 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
19460 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
19470 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
19480 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
19490 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
194a0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
194b0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
194c0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
194d0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
194e0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
194f0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
19500 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
19510 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
19520 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
19530 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
19540 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
19550 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
19560 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
19570 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
19580 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
19590 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
195a0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
195b0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
195c0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
195d0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
195e0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
195f0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
19600 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
19610 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
19620 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
19630 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
19640 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
19650 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
19660 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
19670 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
19680 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
19690 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
196a0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
196b0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
196c0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
196d0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
196e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
196f0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
19700 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
19710 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
19720 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
19730 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
19740 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
19750 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
19760 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
19770 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
19780 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
19790 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
197a0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
197b0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
197c0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
197d0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
197e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
197f0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
19800 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
19810 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
19820 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
19830 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
19840 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
19850 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
19860 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
19870 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
19880 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
19890 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
198a0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
198b0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
198c0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
198d0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
198e0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
198f0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
19900 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
19910 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
19920 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
19930 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
19940 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
19950 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
19960 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
19970 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
19980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19990 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
199a0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
199b0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
199c0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
199d0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
199e0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
199f0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
19a00 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
19a10 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
19a20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
19a30 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
19a40 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
19a50 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
19a60 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
19a70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
19a80 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
19a90 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
19aa0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
19ab0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
19ac0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
19ad0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
19ae0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
19af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
19b00 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
19b10 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
19b20 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
19b30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
19b40 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
19b50 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
19b60 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
19b70 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
19b80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
19b90 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
19ba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19bb0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
19bc0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
19bd0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
19be0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19bf0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
19c00 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
19c10 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
19c20 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
19c30 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
19c40 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
19c50 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
19c60 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
19c70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
19c80 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
19c90 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
19ca0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
19cb0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
19cc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
19cd0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
19ce0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
19cf0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
19d00 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
19d10 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
19d20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
19d30 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
19d40 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
19d50 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
19d60 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
19d70 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
19d80 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
19d90 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
19da0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
19db0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
19dc0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
19dd0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
19de0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
19df0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
19e00 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
19e10 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
19e20 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
19e30 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
19e40 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
19e50 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
19e60 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
19e70 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
19e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
19e90 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
19ea0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
19eb0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
19ec0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
19ed0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
19ee0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
19ef0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
19f00 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
19f10 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
19f20 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
19f30 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
19f40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
19f50 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
19f60 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
19f70 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
19f80 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
19f90 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
19fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
19fb0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
19fc0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
19fd0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
19fe0 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
19ff0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1a000 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1a010 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
1a020 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1a030 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1a040 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a050 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61 67 65 20 29  >mxPgno>=nPage )
1a060 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
1a070 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
1a080 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1a090 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
1a0a0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
1a0b0 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
1a0c0 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
1a0d0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
1a0e0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
1a0f0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
1a100 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
1a110 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
1a120 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
1a130 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
1a140 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
1a150 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
1a160 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
1a170 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
1a180 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
1a190 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
1a1a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a1b0 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
1a1c0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1a1d0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
1a1e0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
1a1f0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
1a200 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
1a210 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
1a220 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
1a230 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
1a240 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
1a250 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
1a260 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
1a270 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
1a280 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
1a290 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1a2a0 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
1a2b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1a2c0 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
1a2d0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1a2e0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
1a2f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
1a300 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
1a310 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1a320 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
1a330 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
1a340 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
1a350 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1a360 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
1a370 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
1a380 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
1a390 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1a3a0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
1a3b0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
1a3c0 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
1a3d0 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
1a3e0 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
1a3f0 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
1a400 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
1a410 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
1a420 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1a430 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
1a440 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
1a450 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
1a460 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
1a470 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
1a480 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
1a490 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
1a4a0 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
1a4b0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
1a4c0 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
1a4d0 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
1a4e0 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
1a4f0 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
1a500 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
1a510 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1a520 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
1a530 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
1a540 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1a550 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
1a560 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
1a570 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
1a580 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
1a590 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1a5a0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
1a5b0 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
1a5c0 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
1a5d0 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
1a5e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1a5f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
1a600 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
1a610 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1a620 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1a630 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a640 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
1a650 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
1a660 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
1a670 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
1a680 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
1a690 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1a6a0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1a6b0 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
1a6c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a6d0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1a6e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1a6f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1a700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a720 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1a730 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1a740 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a750 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
1a760 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d  ith pPager. Norm
1a770 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61  ally, this is ca
1a780 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64 62  lculated as (<db
1a790 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67   file size>/<pag
1a7a0 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77  e-size>)..** How
1a7b0 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
1a7c0 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
1a7d0 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
1a7e0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
1a7f0 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
1a800 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
1a810 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge file..**.** I
1a820 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
1a830 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
1a840 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1a850 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
1a860 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74   the.** error st
1a870 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
1a880 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1a890 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63 68  pnPage left unch
1a8a0 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66  anged. Or,.** if
1a8b0 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
1a8c0 20 68 61 73 20 74 6f 20 62 65 20 71 75 65 72 69   has to be queri
1a8d0 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65 20  ed for the size 
1a8e0 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 0a  of the file and.
1a8f0 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61 74 74  ** the query att
1a900 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e 20  empt returns an 
1a910 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49 4f  IO error, the IO
1a920 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1a930 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1a940 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1a950 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
1a960 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76  Otherwise, if ev
1a970 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
1a980 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c  essful, then SQL
1a990 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1a9a0 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67  ed.** and *pnPag
1a9b0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
1a9c0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1a9d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1a9e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1a9f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1aa00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1aa10 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1aa20 6f 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20  o nPage = 0;    
1aa30 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1aa40 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1aa50 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44  nPage */..  /* D
1aa60 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d  etermine the num
1aa70 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1aa80 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20  the file. Store 
1aa90 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a  this in nPage. *
1aaa0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1aab0 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20  dbSizeValid ){. 
1aac0 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65     nPage = pPage
1aad0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c  r->dbSize;.  }el
1aae0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20  se{.    int rc; 
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65  /* Error returne
1ab10 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28  d by OsFileSize(
1ab20 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d  ) */.    i64 n =
1ab30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ab40 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e   /* File size in
1ab50 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64 20   bytes returned 
1ab60 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
1ab70 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  */..    if( page
1ab80 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20  rUseLog(pPager) 
1ab90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1aba0 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
1abb0 2d 3e 70 4c 6f 67 2c 20 26 6e 50 61 67 65 29 3b  ->pLog, &nPage);
1abc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1abd0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1abe0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1abf0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1ac00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1ac10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   );.      if( is
1ac20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1ac40 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1ac50 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1ac60 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1ac70 6e 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n)) ){.         
1ac80 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1ac90 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
1aca0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1acb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1acc0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26  .      if( n>0 &
1acd0 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
1ace0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1acf0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20  nPage = 1;.     
1ad00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ad10 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
1ad20 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1ad30 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1ad40 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
1ad50 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1ad60 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
1ad70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1ad80 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70  = nPage;.      p
1ad90 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
1ada0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1adb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
1adc0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  alid = 1;.    }.
1add0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1ade0 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
1adf0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1ae00 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
1ae10 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63  than the .  ** c
1ae20 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
1ae30 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
1ae40 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
1ae50 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
1ae60 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
1ae70 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
1ae80 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
1ae90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1aea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
1aeb0 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
1aec0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  e;.  }..  /* Set
1aed0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
1aee0 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  able and return 
1aef0 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a  SQLITE_OK */.  *
1af00 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1af10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1af20 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  OK;.}.../*.** Tr
1af30 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
1af40 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
1af50 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
1af60 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
1af70 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
1af80 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
1af90 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
1afa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1afb0 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
1afc0 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
1afd0 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
1afe0 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
1aff0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
1b000 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
1b010 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
1b020 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
1b030 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
1b040 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
1b050 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
1b060 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
1b070 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
1b080 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
1b090 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
1b0a0 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
1b0b0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
1b0c0 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
1b0d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1b0e0 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
1b0f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1b100 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
1b110 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
1b120 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
1b130 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
1b140 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
1b150 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
1b160 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
1b170 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1b180 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1b190 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1b1a0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
1b1b0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
1b1c0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b1f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
1b200 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
1b210 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
1b220 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
1b230 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
1b240 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
1b250 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
1b260 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
1b270 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
1b280 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
1b290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
1b2a0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
1b2b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1b2c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
1b2d0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
1b2e0 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
1b2f0 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
1b300 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d  known. It.  ** m
1b310 75 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ust not have bee
1b320 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20 74 68  n modified at th
1b330 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20  is point..  */. 
1b340 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b350 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1b360 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
1b370 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
1b380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b390 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1b3a0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
1b3b0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30  r->dbModified==0
1b3c0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
1b3d0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
1b3e0 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
1b3f0 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
1b400 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
1b410 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
1b420 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
1b430 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
1b440 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
1b450 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
1b460 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
1b470 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
1b480 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
1b490 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
1b4a0 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
1b4b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
1b4c0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
1b4d0 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
1b4e0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
1b4f0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26  =PAGER_UNLOCK &&
1b500 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
1b510 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
1b520 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  || (pPager->stat
1b530 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
1b540 44 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  D && locktype==P
1b550 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a  AGER_EXCLUSIVE).
1b560 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67    );..  if( pPag
1b570 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
1b580 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
1b590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
1b5a0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
1b5b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b5c0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1b5d0 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
1b5e0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
1b5f0 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
1b600 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
1b610 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
1b620 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20  ndlerArg) );.   
1b630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
1b650 65 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29  er->state = (u8)
1b660 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
1b670 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
1b680 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1b690 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
1b6a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b6b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
1b6c0 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
1b6d0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
1b6e0 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
1b6f0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
1b700 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
1b710 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
1b720 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
1b730 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
1b740 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
1b750 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
1b760 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1b770 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
1b780 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
1b790 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
1b7a0 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
1b7b0 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
1b7c0 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
1b7d0 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
1b7e0 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
1b7f0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
1b800 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
1b810 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
1b820 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
1b830 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
1b840 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
1b850 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1b860 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
1b870 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
1b880 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
1b890 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
1b8a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1b8b0 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
1b8c0 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
1b8d0 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
1b8e0 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
1b8f0 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
1b900 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
1b910 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
1b920 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
1b930 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
1b940 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
1b950 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
1b960 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
1b970 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
1b980 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
1b990 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
1b9a0 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
1b9b0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
1b9c0 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  our would be to 
1b9d0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
1b9e0 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
1b9f0 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
1ba00 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
1ba10 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
1ba20 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
1ba30 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1ba40 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
1ba50 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
1ba60 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1ba70 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
1ba80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
1ba90 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
1baa0 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
1bab0 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
1bac0 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
1bad0 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
1bae0 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
1baf0 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
1bb00 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
1bb10 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
1bb20 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
1bb30 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
1bb40 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1bb50 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
1bb60 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
1bb70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
1bb80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
1bb90 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
1bba0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
1bbb0 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
1bbc0 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
1bbd0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
1bbe0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1bbf0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
1bc00 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
1bc10 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
1bc20 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
1bc30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
1bc40 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1bc50 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
1bc60 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
1bc70 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1bc80 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
1bc90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
1bca0 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
1bcb0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
1bcc0 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
1bcd0 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
1bce0 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
1bcf0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
1bd00 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
1bd10 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
1bd20 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
1bd30 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
1bd40 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
1bd50 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
1bd60 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
1bd70 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
1bd80 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
1bd90 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1bda0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
1bdb0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
1bdc0 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
1bdd0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1bde0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
1bdf0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1be00 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72  Valid );.  asser
1be10 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
1be20 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
1be30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1be40 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1be50 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  VED );.  pPager-
1be60 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
1be70 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  .  assertTruncat
1be80 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1be90 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  er);.}.../*.** T
1bea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1beb0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
1bec0 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
1bed0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
1bee0 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
1bef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
1bf00 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
1bf10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bf20 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
1bf30 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bf40 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
1bf50 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
1bf60 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
1bf70 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
1bf80 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
1bf90 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
1bfa0 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
1bfb0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
1bfc0 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
1bfd0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
1bfe0 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
1bff0 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
1c000 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
1c010 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
1c020 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
1c030 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
1c040 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
1c050 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
1c060 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
1c070 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
1c080 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
1c090 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
1c0a0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
1c0b0 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
1c0c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c0d0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1c0e0 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
1c0f0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
1c100 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1c110 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
1c120 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1c130 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c140 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
1c150 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1c160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1c170 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1c180 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1c190 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
1c1a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c1b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c1c0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1c1d0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
1c1e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
1c1f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c200 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
1c210 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1c220 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
1c230 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
1c240 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
1c250 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
1c260 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
1c270 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1c280 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
1c290 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1c2a0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
1c2b0 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
1c2c0 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
1c2d0 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
1c2e0 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
1c2f0 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
1c300 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
1c310 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
1c320 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
1c330 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
1c340 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
1c350 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
1c360 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
1c370 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
1c380 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
1c390 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
1c3a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
1c3b0 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
1c3c0 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
1c3d0 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
1c3e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
1c3f0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
1c400 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
1c410 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
1c420 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
1c430 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
1c440 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
1c450 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1c460 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1c470 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
1c480 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70  ger){.  u8 *pTmp
1c490 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
1c4a0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64  >pTmpSpace;..  d
1c4b0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
1c4c0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
1c4d0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
1c4e0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50  gnMalloc();.  pP
1c4f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
1c500 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  0;.  pPager->exc
1c510 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
1c520 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
1c530 65 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20  e(pPager->pLog, 
1c540 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20  pPager->fd, .   
1c550 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
1c560 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73   ? 0 : pPager->s
1c570 79 6e 63 5f 66 6c 61 67 73 29 2c 20 70 54 6d 70  ync_flags), pTmp
1c580 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  .  );.  pPager->
1c590 70 4c 6f 67 20 3d 20 30 3b 0a 20 20 70 61 67 65  pLog = 0;.  page
1c5a0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1c5b0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1c5c0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1c5d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
1c5e0 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61  e{.    /* Set Pa
1c5f0 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  ger.journalHdr t
1c600 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e  o -1 for the ben
1c610 65 66 69 74 20 6f 66 20 74 68 65 20 70 61 67 65  efit of the page
1c620 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20  r_playback() .  
1c630 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20    ** call which 
1c640 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d  may be made from
1c650 20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c   within pagerUnl
1c660 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29  ockAndRollback()
1c670 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69  . If it.    ** i
1c680 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74  s not -1, then t
1c690 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  he unsynced port
1c6a0 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a  ion of an open j
1c6b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a  ournal file may.
1c6c0 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64      ** be played
1c6d0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
1c6e0 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
1c6f0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
1c700 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  rs while.    ** 
1c710 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
1c720 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
1c730 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  may become corru
1c740 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  pt..    */.    i
1c750 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1c760 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
1c770 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1c780 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
1c790 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1c7a0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
1c7b0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
1c7c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
1c7d0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1c7e0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
1c7f0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1c800 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
1c810 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
1c820 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c830 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
1c840 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
1c850 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
1c860 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1c870 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
1c880 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
1c890 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1c8a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
1c8b0 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
1c8c0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1c8d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
1c8e0 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
1c8f0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
1c900 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
1c910 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1c920 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
1c930 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
1c940 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
1c950 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
1c960 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
1c970 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
1c980 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
1c990 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1c9a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
1c9b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
1c9c0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
1c9d0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1c9e0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1c9f0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
1ca00 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
1ca10 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
1ca20 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
1ca30 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
1ca40 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
1ca50 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
1ca60 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
1ca70 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1ca80 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
1ca90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1caa0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
1cab0 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
1cac0 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
1cad0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1cae0 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
1caf0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
1cb00 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
1cb10 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
1cb20 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1cb30 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
1cb40 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
1cb50 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
1cb60 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1cb70 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1cb80 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
1cb90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1cba0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
1cbb0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
1cbc0 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20  ync flag is not 
1cbd0 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
1cbe0 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20  unction is a.** 
1cbf0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1cc00 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
1cc10 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
1cc20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
1cc30 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76  e.** and the dev
1cc40 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1cc50 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66  ics of the the f
1cc60 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
1cc70 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1cc80 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1cc90 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
1cca0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1ccb0 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
1ccc0 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
1ccd0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
1cce0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1ccf0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1cd00 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
1cd10 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1cd20 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
1cd30 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
1cd40 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1cd50 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
1cd60 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
1cd70 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
1cd80 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1cd90 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
1cda0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
1cdb0 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
1cdc0 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
1cdd0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1cde0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
1cdf0 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
1ce00 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1ce10 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1ce20 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
1ce30 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
1ce40 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
1ce50 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
1ce60 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
1ce70 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
1ce80 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
1ce90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1cea0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
1ceb0 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
1cec0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
1ced0 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
1cee0 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
1cef0 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
1cf00 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
1cf10 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
1cf20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
1cf30 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
1cf40 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
1cf50 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
1cf60 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
1cf70 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
1cf80 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1cf90 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
1cfa0 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e  **.** The Pager.
1cfb0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1cfc0 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66 6f   never be set fo
1cfd0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1cfe0 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c  s, or any.** fil
1cff0 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e  e operating in n
1d000 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67  o-sync mode (Pag
1d010 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f  er.noSync set to
1d020 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a   non-zero)..**.*
1d030 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1d040 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
1d050 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
1d060 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
1d070 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
1d080 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
1d090 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
1d0a0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1d0b0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
1d0c0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1d0d0 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
1d0e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1d0f0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1d100 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1d110 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
1d120 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1d130 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1d140 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1d150 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1d160 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1d170 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1d180 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1d190 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1d1a0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
1d1b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d1e0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1d1f0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1d200 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1d210 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1d220 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
1d230 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1d240 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
1d250 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
1d260 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1d270 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
1d280 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
1d290 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
1d2a0 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
1d2b0 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
1d2c0 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
1d2d0 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
1d2e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
1d2f0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
1d300 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
1d310 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
1d320 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
1d330 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
1d340 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
1d350 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
1d360 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
1d370 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
1d380 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
1d390 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
1d3a0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1d3b0 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
1d3c0 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
1d3d0 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
1d3e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
1d3f0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1d400 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
1d410 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
1d420 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
1d430 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
1d440 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
1d450 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
1d460 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
1d470 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
1d480 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
1d490 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
1d4a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1d4b0 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
1d4c0 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
1d4d0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1d4e0 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
1d4f0 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
1d500 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
1d510 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
1d520 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
1d530 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1d540 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
1d550 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
1d560 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1d570 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
1d580 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
1d590 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
1d5a0 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
1d5b0 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
1d5c0 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
1d5d0 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
1d5e0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
1d5f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1d600 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
1d610 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
1d620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
1d630 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
1d640 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
1d650 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
1d660 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
1d670 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
1d680 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
1d690 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
1d6a0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
1d6b0 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
1d6c0 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
1d6d0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
1d6e0 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
1d6f0 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
1d700 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1d710 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
1d720 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
1d730 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
1d740 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
1d750 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
1d760 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
1d770 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
1d780 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
1d790 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
1d7a0 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
1d7b0 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
1d7c0 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
1d7d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
1d7e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d7f0 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
1d800 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
1d810 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
1d820 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
1d830 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1d840 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
1d850 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
1d860 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
1d870 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
1d880 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
1d890 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
1d8a0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
1d8b0 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
1d8c0 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
1d8d0 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
1d8e0 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
1d8f0 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
1d900 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d910 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1d920 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
1d930 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
1d940 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d960 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
1d970 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
1d980 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
1d990 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1d9a0 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
1d9b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d9c0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1d9d0 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
1d9e0 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
1d9f0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
1da00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1da10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1da20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1da30 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1da40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1da50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
1da60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1da70 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1da80 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1da90 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
1daa0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
1dab0 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
1dac0 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
1dad0 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
1dae0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
1daf0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
1db00 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
1db10 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
1db20 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
1db30 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
1db40 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
1db50 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
1db60 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
1db70 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
1db80 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
1db90 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
1dba0 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
1dbb0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1dbc0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
1dbd0 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
1dbe0 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
1dbf0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
1dc00 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
1dc10 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
1dc20 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1dc30 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
1dc40 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
1dc50 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
1dc60 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
1dc70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
1dc80 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
1dc90 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
1dca0 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
1dcb0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
1dcc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1dcd0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
1dce0 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
1dcf0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1dd00 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
1dd10 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1dd20 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
1dd30 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1dd40 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
1dd50 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1dd60 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1dd70 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
1dd80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1dd90 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1dda0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1ddb0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
1ddc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ddd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1dde0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
1ddf0 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
1de00 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
1de10 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
1de20 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
1de30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1de40 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
1de50 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
1de60 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
1de70 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
1de80 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
1de90 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1dea0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1deb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1dec0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
1ded0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1dee0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
1def0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
1df00 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1df10 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1df20 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1df30 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
1df40 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1df50 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1df60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1df70 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1df80 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1df90 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
1dfa0 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
1dfb0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
1dfc0 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
1dfd0 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
1dfe0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1dff0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e000 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1e010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e020 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
1e030 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
1e040 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
1e050 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e  nced. Set Pager.
1e060 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
1e070 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65   to zero and cle
1e080 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
1e090 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61  D_SYNC flag on a
1e0a0 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a  ll pagess..    *
1e0b0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  /.    pPager->ne
1e0c0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1e0d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1e0e0 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
1e0f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1e100 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
1e110 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73 71 6c  rnalOff;.    sql
1e120 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
1e130 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
1e140 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
1e150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e160 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1e170 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1e180 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
1e190 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
1e1a0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
1e1b0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
1e1c0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
1e1d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1e1e0 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
1e1f0 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
1e200 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
1e210 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
1e220 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
1e230 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
1e240 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
1e250 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
1e260 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
1e270 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1e280 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
1e290 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
1e2a0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
1e2b0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1e2c0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1e2d0 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
1e2e0 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
1e2f0 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
1e300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1e310 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
1e320 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
1e330 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1e340 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
1e350 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
1e360 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
1e370 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
1e380 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1e390 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e3a0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
1e3b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
1e3c0 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
1e3d0 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
1e3e0 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
1e3f0 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
1e400 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
1e410 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
1e420 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
1e430 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
1e440 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
1e450 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
1e460 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
1e470 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
1e480 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
1e490 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
1e4a0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1e4b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1e4c0 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
1e4d0 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
1e4e0 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
1e4f0 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
1e500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
1e510 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
1e520 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1e530 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e540 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
1e550 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
1e560 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1e570 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
1e580 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1e590 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
1e5a0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
1e5b0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1e5c0 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
1e5d0 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
1e5e0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1e5f0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
1e600 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
1e610 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
1e620 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
1e630 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
1e640 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
1e650 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
1e660 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
1e670 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1e680 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
1e690 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
1e6a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e6b0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1e6c0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1e6d0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
1e6e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1e6f0 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
1e700 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
1e710 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
1e720 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1e730 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1e740 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1e750 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
1e760 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
1e770 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1e7a0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e7d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1e7e0 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73 74   if( NEVER(pList
1e7f0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51  ==0) ) return SQ
1e800 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
1e810 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
1e820 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
1e830 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
1e840 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
1e850 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
1e860 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
1e870 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1e880 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
1e890 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
1e8a0 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
1e8b0 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
1e8c0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
1e8d0 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
1e8e0 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
1e8f0 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
1e900 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
1e910 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
1e920 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
1e930 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
1e940 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
1e950 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
1e960 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
1e970 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
1e980 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e990 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
1e9a0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
1e9b0 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
1e9c0 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
1e9d0 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
1e9e0 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
1e9f0 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
1ea00 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
1ea10 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
1ea20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
1ea30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
1ea40 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
1ea50 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
1ea60 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
1ea70 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1ea80 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
1ea90 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
1eaa0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
1eab0 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
1eac0 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
1ead0 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
1eae0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1eaf0 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
1eb00 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
1eb10 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
1eb20 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1eb30 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
1eb40 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
1eb50 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
1eb60 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1eb70 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
1eb80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
1eb90 67 65 72 55 73 65 4c 6f 67 28 70 4c 69 73 74 2d  gerUseLog(pList-
1eba0 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  >pPager) );.  as
1ebb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1ebc0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1ebd0 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  VED );.  rc = pa
1ebe0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1ebf0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1ec00 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20  VE_LOCK);..  /* 
1ec10 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
1ec20 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
1ec30 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
1ec40 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
1ec50 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
1ec60 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
1ec70 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
1ec80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1ec90 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
1eca0 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
1ecb0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
1ecc0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1ecd0 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
1ece0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
1ecf0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1ed00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ed10 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
1ed20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1ed30 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
1ed40 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
1ed50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1ed60 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
1ed70 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1ed80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
1ed90 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
1eda0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
1edb0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1edc0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
1edd0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
1ede0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
1edf0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
1ee00 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1ee10 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
1ee20 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
1ee30 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
1ee40 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
1ee50 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
1ee60 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
1ee70 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
1ee80 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
1ee90 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
1eea0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
1eeb0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
1eec0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
1eed0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
1eee0 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
1eef0 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
1ef00 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
1ef10 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
1ef20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1ef30 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
1ef40 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
1ef50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
1ef60 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
1ef70 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
1ef80 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
1ef90 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
1efa0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1efb0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
1efc0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1efd0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1efe0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1f010 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
1f020 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
1f030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1f040 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
1f050 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1f060 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
1f070 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1f080 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
1f090 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
1f0a0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
1f0b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f0c0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1f0d0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
1f0e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1f0f0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
1f100 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
1f110 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
1f120 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
1f130 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
1f140 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
1f150 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
1f160 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f170 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
1f180 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
1f190 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
1f1a0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1f1b0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
1f1c0 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
1f1d0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
1f1e0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1f1f0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1f200 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1f210 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1f220 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1f230 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f240 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1f250 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
1f260 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f270 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
1f280 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
1f290 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
1f2a0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
1f2b0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
1f2c0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
1f2d0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
1f2e0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1f2f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1f300 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
1f310 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
1f320 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1f330 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1f340 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f360 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1f370 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1f380 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1f390 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1f3a0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1f3b0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1f3c0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1f3d0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1f3e0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1f3f0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1f400 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1f410 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f420 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1f430 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1f440 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1f450 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1f460 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1f470 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1f480 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1f490 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1f4a0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1f4b0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1f4c0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1f4d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1f4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1f4f0 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1f500 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1f510 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1f520 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1f530 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1f540 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1f550 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1f560 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1f570 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1f580 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1f590 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1f5a0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1f5b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1f5c0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1f5d0 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1f5e0 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1f5f0 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1f600 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1f610 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1f620 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1f630 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f640 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1f650 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1f660 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1f670 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1f680 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1f690 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1f6a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1f6b0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1f6c0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1f6d0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1f6e0 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1f6f0 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1f700 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1f710 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1f720 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1f730 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1f740 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1f750 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1f760 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1f770 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1f780 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1f790 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1f7a0 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1f7b0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1f7c0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1f7d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1f7e0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1f7f0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1f800 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1f810 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1f820 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1f830 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1f840 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1f850 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1f860 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1f870 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1f880 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1f890 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
1f8a0 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
1f8b0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
1f8c0 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
1f8d0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1f8e0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
1f8f0 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72    );.    rc = wr
1f900 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1f910 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1f920 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1f930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f940 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1f950 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1f960 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1f970 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1f980 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1f990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1f9a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f9b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1f9c0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1f9d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1f9e0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1f9f0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1fa00 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1fa10 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1fa20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1fa30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1fa40 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1fa50 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1fa60 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1fa70 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1fa80 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
1fa90 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
1faa0 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
1fab0 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
1fac0 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
1fad0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1fae0 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
1faf0 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
1fb00 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
1fb10 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
1fb20 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74 69  nged. .*/ .stati
1fb30 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 67 46 72  c int pagerLogFr
1fb40 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1fb50 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1fb60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1fb70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1fb80 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fba0 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1fbb0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1fbc0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1fbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1fbe0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1fbf0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1fc00 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1fc30 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1fc40 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c 61  /.  int sync_fla
1fc50 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1fc60 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1fc70 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1fc80 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1fc90 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1fcc0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1fcd0 67 65 72 2d 3e 70 4c 6f 67 20 29 3b 0a 20 20 72  ger->pLog );.  r
1fce0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1fcf0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 4c 6f  ames(pPager->pLo
1fd00 67 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  g, .      pPager
1fd10 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1fd20 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1fd30 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c 61  Commit, sync_fla
1fd40 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1fd50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1fd60 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1fd70 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1fd80 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1fd90 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1fda0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1fdb0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1fdc0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1fdd0 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1fde0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1fdf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1fe00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1fe10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
1fe20 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
1fe30 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
1fe40 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
1fe50 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
1fe60 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
1fe70 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1fe80 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
1fe90 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
1fea0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
1feb0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
1fec0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
1fed0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
1fee0 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
1fef0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1ff00 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1ff10 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
1ff20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
1ff30 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
1ff40 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1ff50 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
1ff60 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
1ff70 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1ff80 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
1ff90 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1ffa0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
1ffb0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
1ffc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ffd0 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
1ffe0 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
1fff0 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
20000 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
20010 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
20020 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
20030 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
20040 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
20050 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
20060 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
20070 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
20080 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
20090 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
200a0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
200b0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
200c0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
200d0 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
200e0 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
200f0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
20100 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
20110 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
20120 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
20130 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
20140 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
20150 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20160 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
20170 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
20180 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
20190 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
201a0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
201b0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
201c0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
201d0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
201e0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
201f0 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
20200 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20210 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
20220 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
20230 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
20240 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
20250 29 3b 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  );..  pPg->pDirt
20260 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
20270 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
20280 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
20290 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
202a0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
202b0 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
202c0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
202d0 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
202e0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
202f0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
20300 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
20310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20320 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
20330 6f 67 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  ogFrames(pPager,
20340 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
20350 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20360 20 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53     /* The doNotS
20370 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
20380 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  by the sqlite3Pa
20390 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63 74  gerWrite() funct
203a0 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 20  ion while it.   
203b0 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69   ** is journalli
203c0 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20  ng a set of two 
203d0 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65  or more database
203e0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
203f0 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f 6e  stored.    ** on
20400 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73   the same disk s
20410 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74  ector. Syncing t
20420 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
20430 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a  t allowed while.
20440 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
20450 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
20460 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
20470 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
20480 73 75 63 68 20 61 0a 20 20 20 20 2a 2a 20 73 65  such a.    ** se
20490 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73  t of pages are s
204a0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f  ynced to disk to
204b0 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74  gether. So, if t
204c0 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e  he page this fun
204d0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20  ction.    ** is 
204e0 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63  trying to make c
204f0 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72  lean will requir
20500 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  e a journal sync
20510 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79   and the doNotSy
20520 6e 63 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  nc.    ** flag i
20530 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
20540 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
20550 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
20560 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 20 20   layer will.    
20570 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  ** just have to 
20580 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c  go ahead and all
20590 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
205a0 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
205b0 6f 66 0a 20 20 20 20 2a 2a 20 72 65 75 73 69 6e  of.    ** reusin
205c0 67 20 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20 20  g pPg..    **.  
205d0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
205e0 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
205f0 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
20600 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
20610 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  , do not.    ** 
20620 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
20630 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
20640 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   to disk..    */
20650 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
20660 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a  Pager->errCode).
20670 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
20680 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
20690 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
206a0 45 45 44 5f 53 59 4e 43 29 0a 20 20 20 20 29 7b  EED_SYNC).    ){
206b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
206c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
206d0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
206e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
206f0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
20700 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
20710 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
20720 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  C ){.      rc = 
20730 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
20740 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
20750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20760 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
20770 20 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70   && .        !(p
20780 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20790 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
207a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26  LMODE_MEMORY) &&
207b0 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74  .        !(sqlit
207c0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
207d0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
207e0 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
207f0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a  AP_SAFE_APPEND).
20800 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
20810 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
20820 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
20830 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
20840 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
20850 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
20860 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
20870 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
20880 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
20890 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
208a0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
208b0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
208c0 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
208d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
208e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
208f0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
20900 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
20910 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
20920 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
20930 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
20940 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
20950 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
20960 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
20970 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
20980 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
20990 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
209a0 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
209b0 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
209c0 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
209d0 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
209e0 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
209f0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
20a00 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
20a10 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
20a20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
20a30 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
20a40 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
20a50 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
20a60 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
20a70 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
20a80 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
20a90 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
20aa0 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
20ab0 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
20ac0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
20ad0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
20ae0 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
20af0 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
20b00 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
20b10 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
20b20 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
20b30 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
20b40 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
20b50 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
20b60 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
20b70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20b80 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
20b90 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
20ba0 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
20bb0 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
20bc0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
20bd0 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
20be0 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
20bf0 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
20c00 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
20c10 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
20c20 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
20c30 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
20c40 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
20c50 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
20c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
20c70 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
20c80 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
20c90 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
20ca0 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
20cb0 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
20cc0 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
20cd0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
20ce0 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
20cf0 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
20d00 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
20d10 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
20d20 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
20d30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
20d40 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
20d50 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
20d60 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
20d70 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
20d80 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
20d90 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
20da0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
20db0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
20dc0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
20dd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20de0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
20df0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
20e00 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
20e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
20e20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
20e30 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
20e40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20e50 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
20e60 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
20e70 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20e80 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
20e90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
20ea0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
20eb0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
20ec0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
20ed0 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  ger, rc);.}.../*
20ee0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
20ef0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
20f00 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
20f10 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
20f20 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
20f30 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
20f40 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
20f50 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
20f60 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
20f70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
20f80 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
20f90 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
20fa0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
20fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20fc0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
20fd0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
20fe0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
20ff0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
21000 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
21010 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
21020 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
21030 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
21040 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
21050 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
21060 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
21070 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
21080 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
21090 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
210a0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
210b0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
210c0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
210d0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
210e0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
210f0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
21100 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
21110 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
21120 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
21130 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
21140 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
21150 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
21160 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
21170 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
21180 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
21190 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
211a0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
211b0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
211c0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
211d0 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
211e0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
211f0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
21200 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
21210 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
21220 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
21230 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
21240 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
21250 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
21260 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
21270 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
21280 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
21290 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
212a0 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
212b0 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
212c0 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
212d0 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
212e0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
212f0 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
21300 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
21310 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
21320 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
21330 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
21340 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
21350 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
21360 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
21370 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
21380 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
21390 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
213a0 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
213b0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
213c0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
213d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
213e0 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
213f0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
21400 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
21410 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
21420 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
21430 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
21440 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
21450 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
21460 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
21470 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
21480 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
21490 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
214a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
214b0 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
214c0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
214d0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
214e0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
214f0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
21500 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
21510 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
21520 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
21530 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
21540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
21550 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
21560 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
21570 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
21580 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
215a0 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
215b0 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
215c0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
215d0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
215e0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
215f0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
21600 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
21610 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
21620 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
21630 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
21640 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
21650 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
21660 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
21670 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
21680 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
21690 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
216a0 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
216b0 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
216c0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
216d0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
216e0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
216f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21700 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
21710 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
21720 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
21730 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
21740 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
21750 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
21760 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
21770 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
21780 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
21790 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
217a0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
217b0 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
217c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
217d0 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
217e0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
217f0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
21800 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
21810 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
21820 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
21830 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
21840 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
21850 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
21860 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
21870 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
21880 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
21890 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
218a0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
218b0 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
218c0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
218d0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
218e0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
218f0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
21900 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
21910 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
21920 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
21930 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
21940 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
21950 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
21960 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
21970 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
21980 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
21990 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
219a0 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u16 szPageDflt =
219b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
219c0 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
219d0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
219e0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
219f0 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
21a00 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
21a10 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
21a20 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
21a30 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
21a40 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
21a50 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
21a60 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
21a70 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
21a80 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
21a90 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
21aa0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
21ab0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
21ac0 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
21ad0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
21ae0 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
21af0 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
21b00 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
21b10 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
21b20 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
21b30 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
21b40 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
21b50 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
21b60 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
21b70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
21b80 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
21b90 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
21ba0 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
21bb0 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
21bc0 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
21bd0 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
21be0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
21bf0 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
21c00 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
21c10 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
21c20 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
21c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
21c40 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
21c50 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
21c60 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
21c70 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
21c80 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
21c90 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
21ca0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21cb0 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
21cc0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
21cd0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
21ce0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
21cf0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
21d00 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
21d10 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
21d20 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
21d30 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
21d40 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
21d50 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
21d60 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
21d70 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
21d80 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
21d90 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
21da0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
21db0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
21dc0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
21dd0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
21de0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
21df0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
21e00 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
21e10 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
21e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
21e30 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
21e40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
21e50 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
21e60 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
21e70 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
21e80 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
21e90 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
21ea0 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
21eb0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
21ec0 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
21ed0 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
21ee0 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
21ef0 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
21f00 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
21f10 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
21f20 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
21f30 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
21f40 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
21f50 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
21f60 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  }..    nPathname
21f70 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21f80 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
21f90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21fa0 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
21fb0 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
21fc0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
21fd0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
21fe0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
21ff0 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
22000 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
22010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
22020 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
22030 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
22040 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
22050 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
22060 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
22070 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
22080 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
22090 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
220a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
220b0 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
220c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
220d0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
220e0 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
220f0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
22100 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
22110 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22120 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
22130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22160 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
22170 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22180 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
22190 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
221a0 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
221b0 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
221c0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
221d0 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
221e0 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
221f0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
22200 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
22210 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
22220 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
22230 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
22240 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
22250 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
22280 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
22290 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
222c0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
222d0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
222e0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
222f0 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
22300 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
22310 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
22320 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
22330 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
22340 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
22350 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
22360 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
22370 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
22380 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
22390 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
223a0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
223b0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
223c0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
223d0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
223e0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
223f0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
22400 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
22410 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
22420 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
22430 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
22440 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
22450 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
22460 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
22470 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
22480 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
22490 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
224a0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
224b0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
224c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
224d0 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
224e0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
224f0 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
22500 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
22510 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
22520 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
22530 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
22540 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
22550 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
22560 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
22570 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
22580 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
22590 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
225a0 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
225b0 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
225c0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
225d0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
225e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
225f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
22600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22610 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
22620 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
22630 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
22640 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
22650 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
22660 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
22670 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
22680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
22690 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
226a0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
226b0 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
226c0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
226d0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
226e0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
226f0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
22700 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
22710 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
22720 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
22730 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
22740 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
22750 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
22760 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
22770 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
22780 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
22790 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
227a0 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
227b0 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
227c0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
227d0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
227e0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
227f0 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
22800 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
22810 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
22820 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
22830 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
22840 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
22850 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
22860 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
22870 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
22880 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
22890 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
228a0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
228b0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
228c0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
228d0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
228e0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
228f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  r->zFilename[0]=
22900 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  =0 ) pPager->zJo
22910 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
22920 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22930 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
22940 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
22950 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
22960 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
22970 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
22980 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
22990 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
229a0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
229b0 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
229c0 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
229d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
229e0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
229f0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
22a00 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
22a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
22a20 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
22a30 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
22a40 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
22a50 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
22a60 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
22a70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
22a80 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
22a90 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
22aa0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
22ab0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
22ac0 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
22ad0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
22ae0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
22af0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
22b00 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
22b10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
22b20 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
22b30 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
22b40 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
22b50 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
22b60 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
22b70 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
22b80 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
22b90 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
22ba0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
22bb0 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
22bc0 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
22bd0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
22be0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
22bf0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
22c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
22c10 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
22c20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
22c30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
22c40 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
22c50 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
22c60 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
22c70 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
22c80 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
22c90 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
22ca0 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
22cb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
22cc0 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
22cd0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
22ce0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
22cf0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
22d00 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
22d10 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
22d20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22d30 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
22d40 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
22d50 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
22d60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
22d70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
22d80 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
22d90 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
22da0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
22db0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
22dc0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
22dd0 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
22de0 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
22df0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
22e00 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
22e10 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
22e20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
22e30 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
22e40 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
22e50 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
22e60 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
22e70 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
22e80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
22e90 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
22ea0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
22eb0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
22ec0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
22ed0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
22ee0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
22ef0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
22f00 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
22f10 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
22f20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22f30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22f40 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
22f50 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
22f60 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
22f70 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
22f80 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
22f90 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
22fa0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
22fb0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
22fc0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
22fd0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
22fe0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
22ff0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
23000 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
23010 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
23020 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
23030 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
23040 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
23050 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
23060 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
23070 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
23080 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
23090 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
230a0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
230b0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
230c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
230d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
230e0 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
230f0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
23100 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
23110 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
23120 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
23130 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
23140 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
23150 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
23160 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
23170 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
23180 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
23190 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
231a0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
231b0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
231c0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
231d0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
231e0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
231f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
23200 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
23210 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
23220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
23230 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
23240 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
23250 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
23260 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23270 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
23280 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
23290 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
232a0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
232b0 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
232c0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
232d0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
232e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
232f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23300 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
23310 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
23320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
23330 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
23340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
23350 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
23360 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23370 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
23380 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
23390 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
233a0 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
233b0 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
233c0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
233d0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
233e0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
233f0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
23410 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
23420 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
23430 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
23440 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
23450 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
23460 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
23470 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
23480 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
23490 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
234a0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
234b0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
234c0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
234d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
234e0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
234f0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
23500 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
23510 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
23520 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
23530 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
23540 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
23550 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
23560 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
23570 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
23580 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
23590 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
235a0 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
235b0 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
235c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
235d0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
235e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
235f0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
23600 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
23610 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
23620 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
23630 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
23640 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
23650 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
23660 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
23670 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
23680 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
23690 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
236a0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
236b0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
236c0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
236d0 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
236e0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
236f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
23700 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
23710 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
23720 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
23730 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
23740 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
23750 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
23760 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
23770 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
23780 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
23790 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
237a0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
237b0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
237c0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
237d0 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
237e0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
237f0 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
23800 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
23810 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65  c = 0; */.  asse
23820 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
23830 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
23840 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
23850 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
23860 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
23870 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
23880 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
23890 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
238a0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
238b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
238c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
238d0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
238e0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
238f0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
23900 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
23910 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
23920 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
23930 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
23940 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
23950 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
23960 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
23970 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
23980 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
23990 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
239a0 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
239b0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
239c0 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
239d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
239e0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
239f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
23a00 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
23a10 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
23a20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
23a30 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
23a40 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
23a50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
23a60 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
23a70 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
23a80 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23a90 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
23aa0 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
23ab0 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
23ac0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
23ad0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
23ae0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
23af0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
23b00 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
23b10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
23b20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23b30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
23b40 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
23b50 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
23b60 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
23b70 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
23b80 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
23b90 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
23ba0 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
23bb0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
23bc0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
23bd0 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
23be0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
23bf0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
23c00 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
23c10 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
23c20 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
23c30 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
23c40 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
23c50 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
23c60 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
23c70 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
23c80 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
23c90 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
23ca0 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
23cb0 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
23cc0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
23cd0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
23ce0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
23cf0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
23d00 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
23d10 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
23d20 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
23d30 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
23d40 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
23d50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
23d60 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
23d70 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
23d80 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
23d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23da0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
23db0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
23dc0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
23dd0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
23de0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
23df0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
23e00 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
23e10 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
23e20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
23e30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
23e40 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
23e50 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
23e60 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
23e70 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
23e80 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
23e90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23ea0 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
23eb0 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
23ec0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
23ed0 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
23ee0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
23ef0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
23f00 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
23f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
23f20 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
23f30 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
23f40 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
23f50 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
23f60 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
23f70 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
23f80 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
23f90 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
23fa0 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
23fb0 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
23fc0 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
23fd0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
23fe0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
23ff0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
24000 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
24010 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
24020 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
24030 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
24040 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
24050 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
24060 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
24070 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
24080 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
24090 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
240a0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
240b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
240c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
240d0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
240e0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
240f0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
24100 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
24110 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
24120 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
24130 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
24140 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
24150 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
24160 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24170 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
24180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24190 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
241a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
241b0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
241c0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
241d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
241e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
241f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
24200 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20   exists;        
24210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
24220 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
24230 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
24240 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
24250 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
24260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
24270 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
24280 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
24290 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
242a0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
242b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
242c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
242d0 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
242e0 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69  ARED );..  *pExi
242f0 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  sts = 0;.  rc = 
24300 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
24310 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
24320 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
24330 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
24340 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63  xists);.  if( rc
24350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
24360 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
24370 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20   locked;        
24380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24390 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
243a0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
243b0 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
243c0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
243d0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
243e0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
243f0 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
24400 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
24410 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
24420 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
24430 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
24440 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
24450 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
24460 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
24470 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
24480 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
24490 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
244a0 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
244b0 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
244c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
244d0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
244e0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
244f0 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
24500 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
24510 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
24520 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
24530 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
24540 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
24550 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
24560 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
24570 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
24580 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
24590 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
245a0 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
245b0 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
245c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
245d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
245e0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
245f0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
24600 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
24610 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
24620 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  t nPage;..      
24630 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
24640 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
24650 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
24660 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
24670 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
24680 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
24690 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
246a0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
246b0 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
246c0 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
246d0 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
246e0 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
246f0 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
24700 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
24710 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
24720 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
24730 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
24740 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
24750 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
24760 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
24770 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
24780 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
24790 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
247a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
247b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
247c0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
247d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
247e0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
247f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
24800 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
24810 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
24820 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
24830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24840 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
24850 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
24860 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
24870 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24880 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
24890 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
248a0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
248b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
248c0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
248d0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
248e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
248f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
24900 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
24910 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
24920 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
24930 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
24940 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
24950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24960 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
24970 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
24980 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
24990 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
249a0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
249b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
249c0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
249d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
249e0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
249f0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
24a00 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
24a10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
24a20 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
24a30 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
24a40 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
24a50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24a60 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
24a70 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
24a80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24a90 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
24aa0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
24ab0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
24ac0 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
24ad0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24af0 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
24b00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
24b10 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
24b20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
24b30 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
24b40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
24b50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24b60 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
24b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24b80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
24b90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24bb0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
24bc0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
24bd0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
24be0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
24bf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
24c00 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
24c10 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
24c20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
24c30 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
24c40 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
24c50 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
24c60 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
24c70 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
24c80 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
24c90 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
24ca0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
24cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
24cc0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
24cd0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
24ce0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
24cf0 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
24d00 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
24d10 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
24d20 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
24d30 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
24d40 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
24d50 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
24d60 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
24d70 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
24d80 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
24d90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
24da0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
24db0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
24dc0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
24dd0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
24de0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
24df0 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
24e00 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
24e10 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
24e20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
24e30 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
24e40 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
24e50 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
24e60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
24e70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
24e80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24e90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
24ea0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24eb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24ed0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
24ee0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
24ef0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
24f00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
24f10 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
24f20 0a 2a 2a 20 65 78 69 73 74 73 2e 20 41 73 73 75  .** exists. Assu
24f30 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
24f40 63 75 72 73 2c 20 73 65 74 20 2a 70 45 78 69 73  curs, set *pExis
24f50 74 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 66  ts to 1 if the f
24f60 69 6c 65 20 65 78 69 73 74 73 2c 0a 2a 2a 20 6f  ile exists,.** o
24f70 72 20 30 20 6f 74 68 65 72 77 69 73 65 20 61 6e  r 0 otherwise an
24f80 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
24f90 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 6f 72 20  OK. If an IO or 
24fa0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
24fb0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53  , return.** an S
24fc0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
24fd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
24fe0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
24ff0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
25000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25010 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
25020 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
25030 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
25040 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
25050 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
25060 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
25070 41 4c 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  AL, this ensures
25080 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
25090 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77  e condition betw
250a0 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
250b0 29 20 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20  ) .** below and 
250c0 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
250d0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
250e0 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
250f0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
25100 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c 28  int pagerHasWAL(
25110 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25120 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
25130 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25160 2f 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  /..  if( !pPager
25170 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
25180 20 20 63 68 61 72 20 2a 7a 4c 6f 67 20 3d 20 73    char *zLog = s
25190 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
251a0 25 73 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d  %s-wal", pPager-
251b0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
251c0 20 69 66 28 20 21 7a 4c 6f 67 20 29 7b 0a 20 20   if( !zLog ){.  
251d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
251e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
251f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
25200 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 50 61  ite3OsAccess(pPa
25210 67 65 72 2d 3e 70 56 66 73 2c 20 7a 4c 6f 67 2c  ger->pVfs, zLog,
25220 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
25230 58 49 53 54 53 2c 20 70 45 78 69 73 74 73 29 3b  XISTS, pExists);
25240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
25250 72 65 65 28 7a 4c 6f 67 29 3b 0a 20 20 20 20 7d  ree(zLog);.    }
25260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
25270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25280 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
25290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
252a0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
252b0 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
252c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
252d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
25300 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
25310 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
25320 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25330 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
25340 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
25350 72 74 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28  rt( pagerUseLog(
25360 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
25370 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 4f 70 65   = sqlite3WalOpe
25380 6e 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72  nSnapshot(pPager
25390 2d 3e 70 4c 6f 67 2c 20 26 63 68 61 6e 67 65 64  ->pLog, &changed
253a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
253b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
253c0 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28  t dummy;.    if(
253d0 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
253e0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
253f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
25400 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
25410 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
25420 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
25430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
25440 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25450 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
25460 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 20 20 70 50  dummy);.  }.  pP
25470 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
25480 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 72  GER_SHARED;..  r
25490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
254a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
254b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
254c0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
254d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
254e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
254f0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
25500 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
25510 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
25520 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
25530 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
25540 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
25550 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
25560 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
25570 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
25580 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25590 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
255a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
255b0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
255c0 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
255d0 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
255e0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
255f0 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
25600 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
25610 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
25620 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
25630 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
25640 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
25650 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
25660 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
25670 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
25680 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
25690 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
256a0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
256b0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
256c0 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
256d0 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
256e0 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
256f0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
25700 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
25710 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
25720 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
25730 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
25740 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
25750 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
25760 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
25770 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
25780 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
25790 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
257a0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
257b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
257c0 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
257d0 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
257e0 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
257f0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
25800 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
25810 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
25820 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
25830 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
25840 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
25850 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
25860 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
25870 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
25880 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
25890 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
258a0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
258b0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
258c0 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
258d0 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
258e0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
258f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
25900 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
25910 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
25920 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
25930 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
25940 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
25950 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
25960 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
25970 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
25980 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
25990 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
259a0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
259b0 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
259c0 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
259d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
259e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
259f0 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
25a00 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
25a10 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25a20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
25a30 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
25a40 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
25a50 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
25a60 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
25a70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
25a80 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
25a90 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
25aa0 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
25ab0 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
25ac0 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
25ad0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
25ae0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
25af0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
25b00 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
25b10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
25b20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
25b30 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
25b40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
25b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25b80 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  /.  int isErrorR
25b90 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  eset = 0;       
25ba0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25bb0 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f  f recovering fro
25bc0 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  m error state */
25bd0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
25be0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
25bf0 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
25c00 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
25c10 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
25c20 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
25c30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
25c40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
25c50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
25c60 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  che)==0 );.  if(
25c70 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
25c80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
25c90 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
25ca0 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
25cb0 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
25cc0 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72  base is in an er
25cd0 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
25ce0 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
25cf0 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
25d00 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
25d10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
25d20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
25d30 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e  rollback.  ** an
25d40 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e  y hot journal in
25d50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
25d60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
25d70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
25d80 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
25d90 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
25da0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
25db0 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72  ){.      isError
25dc0 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Reset = 1;.    }
25dd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
25de0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
25df0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
25e00 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
25e10 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f    if( pagerUseLo
25e20 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  g(pPager) ){.   
25e30 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 53   rc = pagerOpenS
25e40 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 29 3b  napshot(pPager);
25e50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
25e60 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
25e70 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72  R_UNLOCK || isEr
25e80 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
25e90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
25ea0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
25eb0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  r->pVfs;.    int
25ec0 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20   isHotJournal = 
25ed0 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  0;.    int isWal
25ee0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
25ef0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
25f00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
25f10 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
25f20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
25f30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
25f40 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
25f50 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25f60 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
25f70 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  y );.      pPage
25f80 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
25f90 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c  _SHARED;.    }el
25fa0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
25fb0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
25fc0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
25fd0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
25fe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25ff0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
26000 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
26010 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
26020 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26030 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
26040 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
26050 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
26060 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
26070 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
26080 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
26090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
260a0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
260b0 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
260c0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
260d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
260e0 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
260f0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
26100 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
26110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26120 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29   !isErrorReset )
26130 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26140 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d  pPager->state <=
26150 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b   PAGER_SHARED );
26160 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
26170 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
26180 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29  , &isHotJournal)
26190 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
261a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
261b0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
261c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
261d0 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52      if( isErrorR
261e0 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75  eset || isHotJou
261f0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
26200 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
26210 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
26220 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
26230 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
26240 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
26250 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
26260 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
26270 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
26280 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
26290 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
262a0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
262b0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
262c0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
262d0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
262e0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
262f0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
26300 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
26310 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
26320 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
26330 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
26340 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
26350 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
26360 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
26370 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
26380 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
26390 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
263a0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
263b0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
263c0 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
263d0 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
263e0 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
263f0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
26400 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
26410 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
26420 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
26430 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
26440 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
26450 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
26460 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
26470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26480 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26490 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
264a0 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
264b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
264c0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
264d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
264e0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
264f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26510 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
26520 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
26530 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
26540 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
26550 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
26560 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
26570 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
26580 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f    }. .      /* O
26590 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
265a0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
265b0 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
265c0 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
265d0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
265e0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
265f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
26600 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
26610 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  and.      ** pos
26620 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
26630 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
26640 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
26650 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
26660 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
26670 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
26680 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
26690 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
266a0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65  es.      ** a re
266b0 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
266c0 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndle..      */. 
266d0 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
266e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
266f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
26700 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
26710 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
26720 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
26730 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
26740 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
26750 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
26760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26770 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
26780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
26790 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
267a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
267b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
267c0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
267d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
267e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
267f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
26800 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
26810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26820 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
26830 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26840 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
26850 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
26860 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
26870 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
26880 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26890 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
268a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
268b0 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
268c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
268d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
268e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
268f0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
26900 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26910 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
26920 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
26930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
26940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26950 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
26960 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
26970 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
26980 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
26990 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
269a0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
269b0 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
269c0 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
269d0 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
269e0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
269f0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
26a00 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
26a10 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
26a20 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   it .           
26a30 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
26a40 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
26a50 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
26a60 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
26a70 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
26a80 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
26a90 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
26aa0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
26ab0 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
26ac0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26ad0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
26ae0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
26af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26b00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
26b10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26b20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
26b30 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
26b40 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65  }..      /* Rese
26b50 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74  t the journal st
26b60 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69  atus fields to i
26b70 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
26b80 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a   have no.      *
26b90 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
26ba0 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  al at this time.
26bb0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
26bc0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
26bd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
26be0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
26bf0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
26c00 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
26c10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
26c20 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
26c30 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
26c40 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
26c50 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
26c60 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  nced to disk. */
26c70 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
26c80 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
26c90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
26ca0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
26cb0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
26cc0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
26cd0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
26ce0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
26cf0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
26d00 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
26d10 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
26d20 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
26d30 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
26d40 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
26d50 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
26d60 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
26d70 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
26d80 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
26d90 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
26da0 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
26db0 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
26dc0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
26dd0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
26de0 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
26df0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
26e00 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
26e10 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
26e20 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
26e30 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
26e40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
26e50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26e60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
26e70 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
26e80 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
26e90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26eb0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26ec0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
26ed0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
26ee0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26f00 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
26f10 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
26f20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
26f30 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
26f40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26f50 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
26f60 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
26f70 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
26f80 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
26f90 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
26fa0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
26fb0 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
26fc0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
26fd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
26fe0 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
26ff0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
27000 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
27010 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
27020 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
27030 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
27040 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
27050 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
27060 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
27070 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
27080 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
27090 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
270a0 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
270b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
270c0 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
270d0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
270e0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
270f0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
27100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
27110 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
27120 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
27130 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
27140 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
27150 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
27160 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
27170 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
27180 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
27190 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
271a0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
271b0 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
271c0 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
271d0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
271e0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
271f0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
27200 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
27210 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
27220 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
27230 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
27240 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
27250 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
27260 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
27270 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
27280 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
27290 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
272a0 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
272b0 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
272c0 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
272d0 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
272e0 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
272f0 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
27300 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
27310 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
27320 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
27330 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
27340 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
27350 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
27360 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
27370 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
27380 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
27390 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
273a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
273b0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
273c0 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
273d0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
273e0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
273f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27400 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
27410 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
27420 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
27430 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
27440 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
27450 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27460 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
27470 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
27480 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
27490 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
274a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
274b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
274c0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
274d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
274e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
274f0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
27500 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
27510 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
27520 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
27530 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
27540 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
27550 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
27560 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
27570 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
27580 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
27590 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
275a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
275b0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
275c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
275d0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
275e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73     rc = pagerHas
275f0 57 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73 57  WAL(pPager, &isW
27600 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  al);.    if( rc!
27610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27620 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
27630 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
27640 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 61  sWal ){.      pa
27650 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
27660 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
27670 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 4c 6f  lite3PagerOpenLo
27680 67 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  g(pPager, 0);.  
27690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
276a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
276b0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 53   rc = pagerOpenS
276c0 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 29 3b  napshot(pPager);
276d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
276e0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
276f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
27700 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
27710 4c 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  L ){.      pPage
27720 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
27730 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
27740 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d  DE_DELETE;.    }
27750 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
27760 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27770 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
27780 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
27790 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
277a0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
277b0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
277c0 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
277d0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
277e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
277f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
27800 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
27810 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
27820 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
27830 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
27840 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
27850 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
27860 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
27870 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
27880 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
27890 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
278a0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
278b0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
278c0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
278d0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
278e0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
278f0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
27900 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
27910 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
27920 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
27930 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
27940 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
27950 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
27960 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
27970 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26  PCache)==0).   &
27980 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
27990 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
279a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
279b0 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67  0) .  ){.    pag
279c0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
279d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
279e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
279f0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
27a00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
27a10 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
27a20 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
27a30 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
27a40 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
27a50 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
27a60 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
27a70 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
27a80 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
27a90 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
27aa0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
27ab0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
27ac0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
27ad0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
27ae0 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
27af0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
27b00 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
27b10 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
27b20 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
27b30 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
27b40 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
27b50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
27b60 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
27b70 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
27b80 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
27b90 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
27ba0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
27bb0 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
27bc0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
27bd0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
27be0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
27bf0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
27c00 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
27c10 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
27c20 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
27c30 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
27c40 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
27c50 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
27c60 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
27c70 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
27c80 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
27c90 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
27ca0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27cb0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
27cc0 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
27cd0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
27ce0 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
27cf0 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
27d00 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
27d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
27d20 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
27d30 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
27d40 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
27d50 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
27d60 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
27d70 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
27d80 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
27d90 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
27da0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
27db0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
27dc0 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
27dd0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
27de0 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
27df0 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
27e00 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
27e10 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
27e20 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
27e30 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
27e40 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
27e50 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
27e60 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
27e70 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
27e80 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
27e90 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
27ea0 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
27eb0 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
27ec0 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
27ed0 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
27ee0 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
27ef0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
27f00 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
27f10 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
27f20 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
27f30 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
27f40 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
27f50 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
27f60 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
27f70 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
27f80 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
27f90 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
27fa0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
27fb0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
27fc0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
27fd0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
27fe0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
27ff0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
28000 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
28010 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
28020 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
28030 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
28040 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
28050 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
28060 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
28070 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
28080 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
28090 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
280a0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
280b0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
280c0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
280d0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
280e0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
280f0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
28100 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
28110 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
28120 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
28130 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
28140 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
28150 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
28160 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
28170 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
28180 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
28190 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
281a0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
281b0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
281c0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
281d0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
281e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
281f0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
28200 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
28210 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
28220 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
28230 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
28240 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
28250 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
28260 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
28270 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
28280 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
28290 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
282a0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
282b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
282c0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
282d0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
282e0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
282f0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
28300 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
28310 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
28320 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
28330 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
28340 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
28350 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
28360 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
28370 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
28380 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
28390 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
283a0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
283b0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
283c0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
283d0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
283e0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
283f0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
28400 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
28410 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
28420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28430 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
28440 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
28450 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
28460 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
28470 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
28480 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
28490 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
284a0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
284b0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
284c0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
284d0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
284e0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
284f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
28500 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
28510 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
28520 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
28530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28540 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
28550 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  _UNLOCK );..  if
28560 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
28570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
28580 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
28590 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
285a0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
285b0 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
285c0 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
285d0 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
285e0 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
285f0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
28600 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
28610 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
28620 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
28630 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
28640 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
28650 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
28660 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
28670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
28680 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
28690 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
286a0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
286b0 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
286c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
286d0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
286e0 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
286f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
28700 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
28710 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
28720 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
28730 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
28740 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
28750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
28760 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
28770 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
28780 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
28790 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
287a0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
287b0 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
287c0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
287d0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
287e0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
287f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
28800 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
28810 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
28820 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
28830 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
28840 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21  ge)->pPager && !
28850 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
28860 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
28870 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
28880 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
28890 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
288a0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
288b0 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
288c0 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
288d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
288e0 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
288f0 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
28900 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
28910 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45  ger) );.    PAGE
28920 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
28930 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Hit);.    return
28940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
28950 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
28960 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
28970 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
28980 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
28990 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
289a0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
289b0 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  .  */.    int nM
289c0 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49  ax;..    PAGER_I
289d0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
289e0 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  s);.    pPg = *p
289f0 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
28a00 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
28a10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
28a20 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
28a30 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
28a40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
28a50 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
28a60 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
28a70 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
28a80 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
28a90 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
28aa0 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
28ab0 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
28ac0 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
28ad0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
28ae0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
28af0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28b00 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
28b10 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
28b20 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
28b30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28b40 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
28b50 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66  , &nMax);.    if
28b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28b70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
28b80 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
28b90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
28ba0 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69  MEMDB || nMax<(i
28bb0 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  nt)pgno || noCon
28bc0 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
28bd0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
28be0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
28bf0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
28c00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28c10 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
28c20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
28c30 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
28c40 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
28c50 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
28c60 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
28c70 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
28c80 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
28c90 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
28ca0 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
28cb0 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
28cc0 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
28cd0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
28ce0 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
28cf0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
28d00 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
28d10 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
28d20 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
28d30 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
28d40 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
28d50 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
28d60 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
28d70 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
28d80 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
28d90 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
28da0 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
28db0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
28dc0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
28dd0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
28de0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
28df0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
28e00 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
28e10 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
28e20 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
28e30 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
28e40 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
28e50 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
28e60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
28e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28e80 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
28e90 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
28ea0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
28eb0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
28ec0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
28ed0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
28ee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
28ef0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
28f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
28f10 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
28f20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
28f30 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
28f40 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
28f50 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
28f60 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
28f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28f80 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
28f90 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r );.      rc = 
28fa0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
28fb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28fd0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
28fe0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
28ff0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
29000 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
29010 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
29020 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
29030 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
29040 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
29050 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
29060 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
29070 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
29080 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
29090 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
290a0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
290b0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
290c0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
290d0 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
290e0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
290f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
29100 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
29110 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
29120 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
29130 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
29140 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
29150 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
29160 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
29170 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
29180 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
29190 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
291a0 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
291b0 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
291c0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
291d0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
291e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
291f0 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
29200 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
29210 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
29220 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
29230 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
29240 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
29250 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
29260 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
29270 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
29280 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
29290 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
292a0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
292b0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
292c0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
292d0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
292e0 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
292f0 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
29300 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
29310 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
29320 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
29330 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
29340 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
29350 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
29360 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
29370 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
29380 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
29390 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
293a0 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
293b0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
293c0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
293d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
293e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
293f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29400 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50 41  ager->state > PA
29410 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
29420 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
29430 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
29440 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
29450 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
29460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
29470 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
29480 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
29490 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
294a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
294b0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
294c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
294d0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
294e0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
294f0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
29500 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
29510 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
29520 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
29530 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
29540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
29550 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
29560 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
29570 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
29580 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
29590 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
295a0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
295b0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
295c0 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
295d0 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
295e0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
295f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
29600 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
29610 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72  nal file has alr
29620 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
29630 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  , ensure that th
29640 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  e.** sub-journal
29650 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f   file is open to
29660 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  o. If the main j
29670 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70  ournal is not op
29680 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en,.** this func
29690 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
296a0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
296b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
296c0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
296d0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
296e0 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45  n. .** An SQLITE
296f0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
29700 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29710 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a  d if a call to .
29720 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  ** sqlite3OsOpen
29730 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  () fails..*/.sta
29740 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
29750 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
29760 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
29770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
29780 66 28 20 28 70 61 67 65 72 55 73 65 4c 6f 67 28  f( (pagerUseLog(
29790 70 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65  pPager) || isOpe
297a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 20  n(pPager->jfd)) 
297b0 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
297c0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
297d0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
297e0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
297f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
29800 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
29810 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
29820 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
29830 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
29840 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
29850 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
29860 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
29870 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
29880 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
29890 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
298a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
298b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
298c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
298d0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
298e0 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
298f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
29900 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
29910 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
29920 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
29930 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
29940 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
29950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
29960 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
29970 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
29980 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
29990 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
299a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
299b0 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
299c0 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
299d0 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
299e0 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
299f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
29a00 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
29a10 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
29a20 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
29a30 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
29a40 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
29a50 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
29a60 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
29a70 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
29a80 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
29a90 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
29aa0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
29ab0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
29ac0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
29ad0 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
29ae0 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
29af0 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
29b00 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
29b10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
29b20 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
29b30 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
29b40 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
29b50 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
29b60 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
29b70 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
29b80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
29b90 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
29ba0 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
29bb0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
29bc0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
29bd0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
29be0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
29bf0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
29c00 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
29c10 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
29c20 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
29c30 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
29c40 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
29c50 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
29c60 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
29c70 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29c80 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
29c90 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
29ca0 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
29cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
29cc0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
29cd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29ce0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29cf0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
29d20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
29d50 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
29d60 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
29d70 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
29d80 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
29d90 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
29da0 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
29db0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
29dc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
29dd0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
29de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29df0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
29e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29e10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
29e20 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29e30 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
29e40 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
29e50 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
29e60 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
29e70 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29e80 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
29e90 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
29ea0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
29eb0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
29ec0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
29ed0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
29ee0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
29ef0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
29f00 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
29f10 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
29f20 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
29f30 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74  r->errCode;..  t
29f40 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
29f50 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
29f60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
29f70 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
29f80 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
29f90 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
29fa0 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
29fb0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
29fc0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
29fd0 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(nPage);.  if( 
29fe0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29ff0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  al==0 ){.    ret
2a000 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2a020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2a030 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
2a040 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
2a050 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2a060 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2a070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2a080 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2a090 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2a0a0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
2a0b0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
2a0c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2a0d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a0e0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2a0f0 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
2a100 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2a110 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
2a120 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
2a130 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
2a140 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2a150 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
2a160 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
2a170 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
2a180 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2a190 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
2a1a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2a1b0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
2a1c0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2a1d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
2a1e0 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2a1f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2a200 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2a210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2a220 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
2a230 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
2a240 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2a250 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
2a260 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
2a270 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
2a280 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
2a290 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2a2a0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2a2b0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2a2c0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
2a2d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2a2e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2a2f0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2a300 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2a310 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74  .  }...  /* Writ
2a320 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
2a330 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2a340 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2a350 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68  nd open .  ** th
2a360 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
2a370 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2a380 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
2a3a0 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
2a3b0 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
2a3c0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
2a3d0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
2a3e0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
2a3f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2a400 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2a410 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
2a420 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2a430 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2a440 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
2a450 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a460 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
2a470 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
2a480 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
2a490 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
2a4a0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
2a4b0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
2a4c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2a4d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2a4e0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  er->nSavepoint )
2a4f0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  {.    rc = openS
2a500 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2a510 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
2a520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a530 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
2a540 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
2a550 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
2a560 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2a570 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nal = 0;.  }.  r
2a580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a590 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
2a5a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
2a5b0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2a5c0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2a5d0 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
2a5e0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
2a5f0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
2a600 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2a610 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2a620 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
2a630 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
2a640 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
2a650 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
2a660 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
2a670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2a680 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
2a690 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
2a6a0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
2a6b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
2a6c0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
2a6d0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
2a6e0 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
2a6f0 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
2a700 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
2a710 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
2a720 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
2a730 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20  emory file and, 
2a740 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a750 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69   is .** opened i
2a760 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65  f it has not bee
2a770 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61  n already. For a
2a780 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2a790 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a   the opening .**
2a7a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2a7b0 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
2a7c0 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
2a7d0 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  an actual need t
2a7e0 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74  o .** write to t
2a7f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f  he journal. TODO
2a800 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d  : Why handle tem
2a810 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66  porary files dif
2a820 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20  ferently?.**.** 
2a830 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
2a840 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f  ile is opened (o
2a850 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
2a860 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61  dy open), then a
2a870 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  .** journal-head
2a880 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  er is written to
2a890 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
2a8a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
2a8b0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
2a8c0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
2a8d0 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
2a8e0 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
2a8f0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
2a900 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
2a910 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
2a920 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
2a930 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
2a940 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
2a950 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
2a960 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
2a970 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
2a980 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
2a990 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
2a9a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2a9b0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
2a9c0 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
2a9d0 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
2a9e0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
2a9f0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
2aa00 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
2aa10 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
2aa20 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
2aa30 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
2aa40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2aa50 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
2aa60 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
2aa70 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
2aa80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2aa90 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
2aaa0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
2aab0 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
2aac0 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
2aad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
2aae0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2aaf0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
2ab00 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  CK );.  pPager->
2ab10 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
2ab20 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
2ab30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
2ab40 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
2ab50 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
2ab60 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2ab70 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
2ab80 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
2ab90 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2aba0 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  le );..    if( p
2abb0 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
2abc0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  r) ){.      /* G
2abd0 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
2abe0 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
2abf0 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
2ac00 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
2ac10 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 58 43      ** PAGER_EXC
2ac20 4c 55 53 49 56 45 20 73 74 61 74 65 2e 20 4f 74  LUSIVE state. Ot
2ac30 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2ac40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
2ac50 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2ac60 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
2ac70 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
2ac80 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
2ac90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
2aca0 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
2acb0 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
2acc0 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
2acd0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
2ace0 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
2acf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2ad00 3d 20 73 71 6c 69 74 65 33 57 61 6c 57 72 69 74  = sqlite3WalWrit
2ad10 65 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 70 4c  eLock(pPager->pL
2ad20 6f 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  og, 1);.      if
2ad30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ad40 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2ad50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
2ad60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2ad70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2ad80 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
2ad90 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
2ada0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2adb0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ff = 0;.      }.
2adc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2add0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
2ade0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
2adf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ae00 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
2ae10 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
2ae20 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
2ae30 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
2ae40 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
2ae50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
2ae60 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
2ae70 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
2ae80 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
2ae90 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
2aea0 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
2aeb0 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
2aec0 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
2aed0 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
2aee0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
2aef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2af00 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
2af10 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
2af20 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2af30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2af40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2af50 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
2af60 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
2af70 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
2af80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2af90 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2afa0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
2afb0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2afc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2afd0 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ..    /* No need
2afe0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2aff0 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 69  rnal file at thi
2b000 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c  s time.  It will
2b010 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65   be.    ** opene
2b020 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  d before it is w
2b030 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66 20 77  ritten to.  If w
2b040 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e 67 20  e defer opening 
2b050 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20  the journal,.   
2b060 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73 61 76   ** we might sav
2b070 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72  e the work of cr
2b080 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 66  eating a file if
2b090 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b0a0 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75 70 20  .    ** ends up 
2b0b0 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20  being a no-op.. 
2b0c0 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66     */.  }else if
2b0d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2b0e0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
2b0f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
2b100 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
2b110 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
2b120 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
2b130 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
2b140 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a  e the last.    *
2b150 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
2b160 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
2b170 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
2b180 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
2b190 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
2b1a0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
2b1b0 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
2b1c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b1d0 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
2b1e0 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74  ept open and eit
2b1f0 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65  her was truncate
2b200 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20  d to 0 bytes or 
2b210 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20  its header was. 
2b220 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65     ** overwritte
2b230 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
2b240 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2b250 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61   pagerUseLog(pPa
2b260 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ger)==0 );.    a
2b270 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2b280 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2b290 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2b2a0 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  OrigSize==0 );. 
2b2b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b2c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2b2d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
2b2e0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
2b2f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2b300 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
2b310 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
2b320 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2b330 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2b350 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64  sert( !pPager->d
2b360 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20  bModified );.   
2b370 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49   /* Ignore any I
2b380 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  O error that occ
2b390 75 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72  urs within pager
2b3a0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2b3b0 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  (). The.    ** p
2b3c0 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
2b3d0 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20  all is to reset 
2b3e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
2b3f0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a  te of the pager.
2b400 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65      ** sub-syste
2b410 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61  m. It doesn't ma
2b420 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72  tter if the jour
2b430 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
2b440 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20  properly.    ** 
2b450 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69  finalized at thi
2b460 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69  s point (since i
2b470 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
2b480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
2b490 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  yway)..    */.  
2b4a0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
2b4b0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
2b4c0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
2b4d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
2b4e0 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
2b4f0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
2b500 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
2b510 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2b520 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
2b530 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
2b540 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
2b550 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
2b560 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
2b570 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
2b580 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2b590 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
2b5a0 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
2b5b0 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
2b5c0 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
2b5d0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
2b5e0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
2b5f0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
2b600 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
2b610 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
2b620 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
2b630 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2b640 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2b650 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
2b660 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2b670 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
2b680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b690 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2b6a0 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
2b6b0 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
2b6c0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2b6d0 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72  y been.  ** star
2b6e0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
2b6f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2b700 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
2b710 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  D );..  /* If an
2b720 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
2b730 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63  previously detec
2b740 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20  ted, report the 
2b750 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20  same error.  ** 
2b760 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
2b770 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2b780 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
2b790 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2b7a0 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
2b7b0 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
2b7c0 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
2b7d0 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
2b7e0 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
2b7f0 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
2b800 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
2b810 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
2b820 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
2b830 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
2b840 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
2b850 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73  ITE_PERM;..  ass
2b860 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
2b870 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
2b880 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
2b890 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2b8a0 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
2b8b0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
2b8c0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
2b8d0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
2b8e0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
2b8f0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
2b900 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
2b910 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
2b920 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
2b930 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2b940 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
2b950 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2b960 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
2b970 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
2b980 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2b990 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
2b9a0 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
2b9b0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
2b9c0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
2b9d0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
2b9e0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
2b9f0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
2ba00 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
2ba10 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
2ba20 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
2ba30 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
2ba40 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72  **.    ** Higher
2ba50 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
2ba60 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
2ba70 61 64 79 20 73 74 61 72 74 65 64 20 61 20 74 72  ady started a tr
2ba80 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a  ansaction,.    *
2ba90 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  * which means th
2baa0 65 79 20 68 61 76 65 20 61 63 71 75 69 72 65 64  ey have acquired
2bab0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
2bac0 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f 6c  ocks but the rol
2bad0 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
2bae0 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
2baf0 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20  et be open..    
2bb00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2bb10 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
2bb20 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d  ager, 0, pPager-
2bb30 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a  >subjInMemory);.
2bb40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2bb50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2bb60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2bb70 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2bb80 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2bb90 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2bba0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2bbb0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2bbc0 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 72   .     && !pager
2bbd0 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 0a 20  UseLog(pPager). 
2bbe0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
2bbf0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2bc00 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20  ournal );.      
2bc10 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
2bc20 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
2bc30 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2bc40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2bc50 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2bc60 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2bc70 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  ed = 1;.  .    /
2bc80 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
2bc90 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
2bca0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
2bcb0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
2bcc0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
2bcd0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
2bce0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2bcf0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
2bd00 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
2bd10 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
2bd20 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
2bd30 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
2bd40 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
2bd50 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a      if( !pageInJ
2bd60 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69  ournal(pPg) && i
2bd70 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2bd80 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
2bd90 72 74 28 20 21 70 61 67 65 72 55 73 65 4c 6f 67  rt( !pagerUseLog
2bda0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2bdb0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
2bdc0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
2bdd0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
2bde0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
2bdf0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2be00 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
2be10 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
2be20 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
2be30 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
2be40 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
2be50 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
2be60 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
2be70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
2be80 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
2be90 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2bea0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
2beb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
2bec0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
2bed0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
2bee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2bef0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
2bf00 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
2bf10 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
2bf20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2bf30 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2bf40 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2bf50 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
2bf60 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
2bf70 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
2bf80 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
2bf90 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
2bfa0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2bfb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
2bfc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
2bfd0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2bfe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c010 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
2c020 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2c030 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c050 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
2c060 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
2c070 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
2c080 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2c090 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
2c0a0 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
2c0b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
2c0c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c0d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2c0e0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2c0f0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
2c100 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
2c110 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
2c120 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2c130 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
2c140 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
2c150 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
2c160 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
2c170 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
2c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2c1a0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2c1b0 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
2c1c0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2c1d0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
2c1e0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
2c1f0 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
2c200 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
2c210 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
2c220 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2c230 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2c240 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2c250 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
2c260 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
2c270 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
2c280 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
2c290 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
2c2a0 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
2c2b0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
2c2c0 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
2c2d0 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
2c2e0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
2c2f0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
2c300 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
2c310 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
2c320 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
2c330 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
2c340 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
2c350 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
2c360 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
2c370 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
2c380 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
2c390 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
2c3a0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
2c3b0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
2c3c0 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
2c3d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c3e0 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
2c3f0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2c400 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
2c410 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2c420 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
2c430 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
2c440 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
2c450 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2c460 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
2c470 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2c480 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2c490 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
2c4a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2c4b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2c4c0 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
2c4d0 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
2c4e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c4f0 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
2c500 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
2c510 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
2c520 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
2c530 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
2c540 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
2c550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c560 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c570 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
2c580 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2c590 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
2c5a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2c5b0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
2c5c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2c5d0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
2c5e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2c5f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2c600 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c610 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2c620 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2c630 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2c640 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
2c650 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2c660 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
2c670 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2c680 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2c690 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2c6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c6b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2c6d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
2c6e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2c6f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2c700 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2c710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
2c720 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
2c730 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
2c740 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
2c750 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2c760 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
2c770 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2c780 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2c790 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2c7a0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
2c7b0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
2c7c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2c7d0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2c7e0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c800 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2c810 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
2c820 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
2c830 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
2c840 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
2c850 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
2c860 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
2c870 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
2c880 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
2c890 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
2c8a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2c8b0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
2c8c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
2c8d0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
2c8e0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
2c8f0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
2c900 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
2c910 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
2c920 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
2c930 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
2c940 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
2c950 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2c960 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2c970 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2c980 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
2c990 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
2c9a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
2c9b0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
2c9c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2c9d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2c9e0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
2c9f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2ca00 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
2ca10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
2ca20 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
2ca30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ca40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
2ca50 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
2ca60 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
2ca70 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
2ca80 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
2ca90 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
2caa0 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
2cab0 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
2cac0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2cad0 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
2cae0 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
2caf0 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
2cb00 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
2cb10 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
2cb20 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2cb30 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
2cb40 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2cb50 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
2cb60 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
2cb70 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
2cb80 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
2cb90 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
2cba0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
2cbb0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
2cbc0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
2cbd0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
2cbe0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
2cbf0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
2cc00 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
2cc10 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
2cc20 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2cc30 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
2cc40 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2cc50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2cc60 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
2cc70 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
2cc80 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2cc90 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
2cca0 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
2ccb0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
2ccc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ccd0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
2cce0 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
2ccf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2cd00 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
2cd10 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
2cd20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2cd30 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
2cd40 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
2cd50 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2cd60 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
2cd70 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
2cd80 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
2cd90 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
2cda0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
2cdb0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2cdc0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2cdd0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
2cde0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
2cdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2ce00 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
2ce10 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
2ce20 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
2ce30 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
2ce40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ce50 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
2ce60 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
2ce70 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
2ce80 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2ce90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2cea0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
2ceb0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
2cec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ced0 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
2cee0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2cef0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
2cf00 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
2cf10 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
2cf20 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
2cf30 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
2cf40 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
2cf50 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
2cf60 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
2cf70 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
2cf80 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
2cf90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2cfa0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
2cfb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
2cfc0 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
2cfd0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2cfe0 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
2cff0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
2d000 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
2d010 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
2d020 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
2d030 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
2d040 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
2d050 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
2d060 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
2d070 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
2d080 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
2d090 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
2d0a0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
2d0b0 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
2d0c0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
2d0d0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
2d0e0 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
2d0f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d100 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2d110 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
2d120 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
2d130 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d140 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
2d150 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
2d160 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
2d170 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
2d180 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
2d190 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
2d1a0 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
2d1b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
2d1c0 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
2d1d0 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
2d1e0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
2d1f0 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
2d200 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2d210 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
2d220 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
2d230 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
2d240 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
2d250 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
2d260 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2d270 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2d280 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
2d290 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
2d2a0 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
2d2b0 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
2d2c0 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
2d2d0 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2d2e0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2d2f0 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
2d300 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
2d310 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
2d320 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
2d330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d340 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
2d350 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
2d360 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d380 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2d390 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d3b0 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
2d3c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
2d3e0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2d3f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d400 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2d410 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
2d420 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
2d430 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2d440 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2d450 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d460 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2d470 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
2d480 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
2d490 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
2d4a0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
2d4b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2d4c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
2d4d0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
2d4e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2d4f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2d500 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
2d510 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2d520 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
2d530 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20  YNC flag is set 
2d540 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
2d550 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
2d560 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
2d570 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
2d580 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
2d590 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
2d5a0 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
2d5b0 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
2d5c0 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
2d5d0 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
2d5e0 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
2d5f0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
2d600 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
2d610 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
2d620 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
2d630 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
2d640 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
2d650 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
2d660 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2d670 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2d680 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65  =SQLITE_OK && ne
2d690 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
2d6a0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
2d6b0 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
2d6c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
2d6d0 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
2d6e0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2d6f0 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
2d700 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
2d710 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
2d720 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
2d730 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2d740 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
2d750 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2d760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2d770 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2d780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d790 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2d7a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2d7b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  );.    }..    as
2d7c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
2d7d0 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20  NotSync==1 );.  
2d7e0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2d7f0 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
2d800 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
2d810 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  _write(pDbPage);
2d820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2d830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2d840 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
2d850 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
2d860 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
2d870 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
2d880 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2d890 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
2d8a0 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
2d8b0 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
2d8c0 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
2d8d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2d8e0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
2d8f0 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
2d900 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2d910 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
2d920 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
2d930 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2d940 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  IRTY;.}.#endif..
2d950 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
2d960 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
2d970 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
2d980 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
2d990 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
2d9a0 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
2d9b0 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61  n on page pPg ba
2d9c0 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
2d9d0 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
2d9e0 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
2d9f0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
2da00 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  y.  This happens
2da10 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
2da20 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  hen.** the page 
2da30 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61  has been added a
2da40 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20  s a leaf of the 
2da50 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20  freelist and so 
2da60 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e  its.** content n
2da70 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73  o longer matters
2da80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
2da90 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
2daa0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
2dab0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
2dac0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
2dad0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
2dae0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65  e is unused. The
2daf0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
2db00 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
2db10 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
2db20 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
2db30 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
2db40 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
2db50 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
2db60 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65  on can quadruple
2db70 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
2db80 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f  rge .** DELETE o
2db90 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  perations..*/.vo
2dba0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
2dbb0 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a  ontWrite(PgHdr *
2dbc0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
2dbd0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2dbe0 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d  ger;.  if( (pPg-
2dbf0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2dc00 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
2dc10 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
2dc20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2dc30 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
2dc40 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
2dc50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
2dc60 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
2dc70 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
2dc80 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2dc90 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
2dca0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2dcb0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2dcc0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2dcd0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
2dce0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
2dcf0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2dd00 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
2dd10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2dd20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2dd30 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
2dd40 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
2dd50 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
2dd60 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
2dd70 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
2dd80 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2dd90 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
2dda0 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
2ddb0 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
2ddc0 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r file..**.** If
2ddd0 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
2dde0 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20  e flag is zero, 
2ddf0 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e  then this is don
2de00 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  e by calling .**
2de10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2de20 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20  te() on page 1, 
2de30 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  then modifying t
2de40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2de50 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  he.** page data.
2de60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2de70 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  e file will be u
2de80 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  pdated when the 
2de90 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2dea0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
2deb0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ted..**.** The i
2dec0 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
2ded0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   may only be non
2dee0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62  -zero if the lib
2def0 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
2df00 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51  d.** with the SQ
2df10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2df20 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64  IC_WRITE macro d
2df30 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  efined. In this 
2df40 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69  case,.** if isDi
2df50 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rect is non-zero
2df60 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2df70 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61  ase file is upda
2df80 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
2df90 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70  by writing an up
2dfa0 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  dated version of
2dfb0 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20   page 1 using a 
2dfc0 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20  call to the .** 
2dfd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
2dfe0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2dff0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
2e000 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2e010 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
2e020 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64   int isDirectMod
2e030 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2e040 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2e050 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74  Declare and init
2e060 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20  ialize constant 
2e070 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63  integer 'isDirec
2e080 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  t'. If the.  ** 
2e090 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2e0a0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61  imization is ena
2e0b0 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2e0c0 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63  ld, then isDirec
2e0d0 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61  t.  ** is initia
2e0e0 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
2e0f0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2e100 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61   isDirectMode pa
2e110 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20  rameter.  ** to 
2e120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
2e130 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
2e140 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
2e150 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ro..  **.  ** Th
2e160 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69  e idea is that i
2e170 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
2e180 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2e190 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62  is not.  ** enab
2e1a0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2e1b0 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65  ime, the compile
2e1c0 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74  r can omit the t
2e1d0 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73  ests of.  ** 'is
2e1e0 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61  Direct' below, a
2e1f0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c  s well as the bl
2e200 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20  ock enclosed in 
2e210 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73  the.  ** "if( is
2e220 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74  Direct )" condit
2e230 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
2e240 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e250 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64  ATOMIC_WRITE.# d
2e260 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
2e270 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69 73  E 0.  assert( is
2e280 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
2e290 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2e2a0 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
2e2b0 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  );.#else.# defin
2e2c0 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73  e DIRECT_MODE is
2e2d0 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69  DirectMode.#endi
2e2e0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
2e2f0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2e300 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
2e310 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
2e320 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20  ngeCountDone && 
2e330 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
2e340 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
2e350 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  PgHdr;          
2e360 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
2e370 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
2e380 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63      u32 change_c
2e390 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20  ounter;         
2e3a0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
2e3b0 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75  ue of change-cou
2e3c0 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  nter field */.. 
2e3d0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2e3e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
2e3f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2e400 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
2e410 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
2e420 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
2e430 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2e440 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2e450 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
2e460 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2e470 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
2e480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
2e490 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
2e4a0 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
2e4b0 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
2e4c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2e4d0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
2e4e0 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
2e4f0 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
2e500 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
2e510 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
2e520 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
2e530 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
2e540 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
2e550 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
2e560 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
2e570 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
2e580 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
2e590 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
2e5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
2e5b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
2e5c0 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
2e5d0 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
2e5e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2e5f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e600 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
2e610 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
2e620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e630 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2e640 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
2e650 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
2e660 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
2e670 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  */.      change_
2e680 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
2e690 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
2e6a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2e6b0 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  s);.      change
2e6c0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
2e6d0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
2e6e0 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
2e6f0 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
2e700 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  unter);..      /
2e710 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
2e720 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
2e730 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
2e740 39 36 2e 2e 39 39 20 2a 2f 0a 20 20 20 20 20 20  96..99 */.      
2e750 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2e760 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2e770 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
2e780 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
2e790 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
2e7a0 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
2e7b0 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
2e7c0 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
2e7d0 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
2e7e0 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
2e7f0 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
2e800 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
2e810 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61   = pPgHdr->pData
2e820 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e830 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
2e840 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
2e850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2e860 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
2e870 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
2e880 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
2e890 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e8a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e8b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
2e8c0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
2e8d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e8f0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2e900 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
2e910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2e920 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2e930 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2e940 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
2e950 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
2e960 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2e980 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
2e990 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
2e9a0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
2e9b0 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20  memory files.** 
2e9c0 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68  or pages with th
2e9d0 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
2e9e0 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
2e9f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
2ea00 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
2ea10 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
2ea20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
2ea30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
2ea40 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
2ea50 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
2ea60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ea70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2ea80 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2ea90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2eaa0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eac0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ead0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
2eae0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
2eaf0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2eb00 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  nc ){.    rc = S
2eb10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2eb20 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
2eb30 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2eb40 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2eb50 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
2eb60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2eb70 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
2eb80 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2eb90 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
2eba0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
2ebb0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
2ebc0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
2ebd0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
2ebe0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
2ebf0 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
2ec00 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
2ec10 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
2ec20 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
2ec30 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
2ec40 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
2ec50 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
2ec60 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
2ec70 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
2ec80 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
2ec90 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
2eca0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2ecb0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
2ecc0 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
2ecd0 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
2ece0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
2ecf0 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
2ed00 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2ed10 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
2ed20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
2ed30 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
2ed40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2ed50 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
2ed60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ed70 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
2ed80 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
2ed90 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
2eda0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
2edb0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
2edc0 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
2edd0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
2ede0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2edf0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
2ee00 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
2ee10 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
2ee20 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
2ee30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2ee40 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
2ee50 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ee60 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
2ee70 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
2ee80 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
2ee90 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
2eea0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
2eeb0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
2eec0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
2eed0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2eee0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
2eef0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2ef00 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
2ef10 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
2ef20 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
2ef30 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2ef40 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
2ef50 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
2ef60 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
2ef70 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
2ef80 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
2ef90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2efa0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
2efb0 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
2efc0 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
2efd0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2efe0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2eff0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2f000 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2f010 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2f020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f030 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2f040 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2f050 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
2f060 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
2f070 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
2f080 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
2f090 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
2f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2f0c0 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
2f0d0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
2f0e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2f0f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2f100 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2f110 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2f120 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20  e dbOrigSize is 
2f130 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75  never set if jou
2f140 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f  rnal_mode=OFF */
2f150 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f160 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2f170 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2f180 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d  E_OFF || pPager-
2f190 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
2f1a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69  ;..  /* If a pri
2f1b0 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  or error occurre
2f1c0 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65  d, report that e
2f1d0 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  rror again. */. 
2f1e0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2f1f0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2f200 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2f210 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52  Code;..  PAGERTR
2f220 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
2f230 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
2f240 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
2f250 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
2f260 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2f270 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
2f280 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28  dbSize));..  if(
2f290 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
2f2a0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2f2b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2f2c0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
2f2d0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
2f2e0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
2f2f0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
2f300 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
2f310 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2f320 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
2f330 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
2f340 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
2f350 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
2f360 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
2f370 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
2f380 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
2f390 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
2f3a0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
2f3b0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
2f3c0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
2f3d0 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  NCED && pPager->
2f3e0 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
2f3f0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f    if( pagerUseLo
2f400 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  g(pPager) ){.   
2f410 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
2f420 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
2f430 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2f440 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
2f450 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2f460 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2f470 4c 6f 67 46 72 61 6d 65 73 28 70 50 61 67 65 72  LogFrames(pPager
2f480 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d  , pList, pPager-
2f490 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20  >dbSize, 1, .   
2f4a0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
2f4b0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61  ->fullSync ? pPa
2f4c0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
2f4d0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
2f4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2f4f0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
2f500 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
2f510 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  che);.    }else{
2f520 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
2f530 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
2f540 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
2f550 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
2f560 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a  y how it.      *
2f570 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65  * does this depe
2f580 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
2f590 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
2f5a0 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
2f5b0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61  tion.      ** wa
2f5c0 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
2f5d0 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69  pile time, and i
2f5e0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
2f5f0 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20  on meets the .  
2f600 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63      ** runtime c
2f610 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74  riteria to use t
2f620 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20  he operation: . 
2f630 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2f640 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73      * The file-s
2f650 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
2f660 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2f670 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
2f680 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
2f690 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
2f6a0 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ize, and .      
2f6b0 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
2f6c0 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
2f6d0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
2f6e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
2f6f0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  .      **    * E
2f700 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
2f710 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2f720 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
2f730 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2f740 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2f750 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
2f760 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65  zation was not e
2f770 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
2f780 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65  e time, then the
2f790 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
2f7a0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2f7b0 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  er() function is
2f7c0 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74   called to updat
2f7d0 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20  e the change.   
2f7e0 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e     ** counter in
2f7f0 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27   'indirect-mode'
2f800 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  . If the optimiz
2f810 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  ation is compile
2f820 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a  d in but.      *
2f830 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61  * is not applica
2f840 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e  ble to this tran
2f850 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71  saction, call sq
2f860 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2f870 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  te().      ** to
2f880 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   make sure the j
2f890 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
2f8a0 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72  actually been cr
2f8b0 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c  eated, then call
2f8c0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
2f8d0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2f8e0 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2f8f0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f900 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
2f910 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
2f920 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2f930 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
2f940 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2f950 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61  s both enabled a
2f960 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20  nd applicable,. 
2f970 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c       ** then cal
2f980 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  l pager_incr_cha
2f990 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
2f9a0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
2f9b0 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  e-counter.      
2f9c0 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d  ** in 'direct' m
2f9d0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
2f9e0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2f9f0 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  le will never be
2fa00 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65  .      ** create
2fa10 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
2fa20 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
2fa30 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
2fa40 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2fa50 52 49 54 45 0a 20 20 20 20 20 20 50 67 48 64 72  RITE.      PgHdr
2fa60 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73   *pPg;.      ass
2fa70 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2fa80 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
2fa90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2faa0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2fab0 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 20 20  DE_OFF );.      
2fac0 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20  if( !zMaster && 
2fad0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2fae0 66 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70  fd) .       && p
2faf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2fb00 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  f==jrnlBufferSiz
2fb10 65 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  e(pPager) .     
2fb20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53    && pPager->dbS
2fb30 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize>=pPager->dbF
2fb40 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 20 20 26  ileSize.       &
2fb50 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c  & (0==(pPg = sql
2fb60 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2fb70 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2fb80 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d  che)) || 0==pPg-
2fb90 3e 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29  >pDirty).      )
2fba0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  {.        /* Upd
2fbb0 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
2fbc0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76  change counter v
2fbd0 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72  ia the direct-wr
2fbe0 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ite method. The 
2fbf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
2fc00 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
2fc10 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
2fc20 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
2fc30 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
2fc40 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63         ** to inc
2fc50 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
2fc60 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2fc70 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
2fc80 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a  age 1 .        *
2fc90 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  * directly to th
2fca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2fcb0 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
2fcc0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20  atomic-write .  
2fcd0 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74        ** propert
2fce0 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
2fcf0 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20  le-system, this 
2fd00 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20  is safe..       
2fd10 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2fd20 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2fd30 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
2fd40 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
2fd50 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2fd60 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
2fd70 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
2fd80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2fd90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fda0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2fdb0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2fdc0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2fdd0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
2fde0 20 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20      }.  #else.  
2fdf0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2fe00 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2fe10 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
2fe20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
2fe30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fe40 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2fe50 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
2fe60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
2fe70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2fe80 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
2fe90 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
2fea0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
2feb0 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
2fec0 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
2fed0 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
2fee0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2fef0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
2ff00 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  le. This can onl
2ff10 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  y happen in auto
2ff20 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20  -vacuum mode..  
2ff30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2ff40 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74  Before reading t
2ff50 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61  he pages with pa
2ff60 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65  ge numbers large
2ff70 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20  r than the .    
2ff80 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c    ** current val
2ff90 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
2ffa0 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62  ze, set dbSize b
2ffb0 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
2ffc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69  .      ** that i
2ffd0 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74  t took at the st
2ffe0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
2fff0 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  action. Otherwis
30000 65 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  e, the.      ** 
30010 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
30020 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
30030 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
30040 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20  nstead of .     
30050 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61   ** reading data
30060 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
30070 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
30080 2a 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  *.      ** When 
30090 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46  journal_mode==OF
300a0 46 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a 65  F the dbOrigSize
300b0 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c   is always zero,
300c0 20 73 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a   so this.      *
300d0 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75  * block never ru
300e0 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ns if journal_mo
300f0 64 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20 2a 2f  de=OFF..      */
30100 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .  #ifndef SQLIT
30110 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30120 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  M.      if( pPag
30130 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
30140 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
30150 20 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28        && ALWAYS(
30160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
30170 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
30180 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20  ALMODE_OFF).    
30190 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e    ){.        Pgn
301a0 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  o i;            
301b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
301d0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
301e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e         const Pgn
301f0 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  o iSkip = PAGER_
30200 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
30210 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b   /* Pending lock
30220 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
30230 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
30240 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
30250 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
30260 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
30270 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50  e */ .        pP
30280 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
30290 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
302a0 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e;.        for( 
302b0 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70  i=dbSize+1; i<=p
302c0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
302d0 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
302e0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
302f0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
30300 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
30310 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
30320 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 67 48  .            PgH
30330 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  dr *pPage;      
30340 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
30350 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
30360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30370 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
30380 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
30390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
303a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
303b0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
303c0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
303d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
303e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
303f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
30400 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
30410 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
30420 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
30430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
30440 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
30450 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
30460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30470 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
30480 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
30490 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e  ;.      } .  #en
304a0 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  dif.  .      /* 
304b0 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
304c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
304d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
304e0 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
304f0 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
30500 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
30510 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
30520 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
30530 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20  rnal file, .    
30540 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74    ** or if zMast
30550 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d  er is NULL (no m
30560 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20  aster journal), 
30570 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
30580 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20  s a no-op..     
30590 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
305a0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
305b0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
305c0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
305d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
305e0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
305f0 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
30600 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
30610 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
30620 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
30630 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
30640 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
30650 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c   used, this call
30660 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65   will not create
30670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30680 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
30690 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 6c 20 49  .      ** real I
306a0 4f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  O..      */.    
306b0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
306c0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
306d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
306e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
306f0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
30700 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72  ;.  .      /* Wr
30710 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
30720 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
30730 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
30740 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
30750 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c  ite_pagelist(sql
30760 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
30770 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
30780 63 68 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  che));.      if(
30790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
307a0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
307b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
307c0 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
307d0 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69        goto commi
307e0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
307f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30800 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
30810 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
30820 43 61 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20  Cache);.  .     
30830 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
30840 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74  on disk is not t
30850 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
30860 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
30870 67 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ge,.      ** the
30880 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e  n use pager_trun
30890 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20  cate to grow or 
308a0 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20  shrink the file 
308b0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
308c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
308d0 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  >dbSize!=pPager-
308e0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
308f0 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77         Pgno nNew
30900 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
30910 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53  e - (pPager->dbS
30920 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  ize==PAGER_MJ_PG
30930 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  NO(pPager));.   
30940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
30950 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
30960 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
30970 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
30980 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
30990 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, nNew);.      
309a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
309b0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
309c0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
309d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
309e0 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
309f0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
30a00 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
30a10 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
30a20 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29  ync && !noSync )
30a30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
30a40 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
30a50 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
30a60 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
30a70 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52      }.      IOTR
30a80 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
30a90 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
30aa0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
30ab0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
30ac0 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69  NCED;.  }..commi
30ad0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
30ae0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
30af0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  .../*.** When th
30b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30b10 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62  alled, the datab
30b20 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
30b30 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20  n completely.** 
30b40 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
30b50 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d  ct the changes m
30b60 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65  ade by the curre
30b70 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
30b80 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20  nd.** synced to 
30b90 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61  disk. The journa
30ba0 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  l file still exi
30bb0 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  sts in the file-
30bc0 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67  system .** thoug
30bd0 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c  h, and if a fail
30be0 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68  ure occurs at th
30bf0 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c  is point it will
30c00 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62   eventually.** b
30c10 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d  e used as a hot-
30c20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
30c30 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
30c40 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ion rolled back.
30c50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
30c60 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74  tion finalizes t
30c70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
30c80 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74   either by delet
30c90 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74  ing, .** truncat
30ca0 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79  ing or partially
30cb0 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20   zeroing it, so 
30cc0 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62  that it cannot b
30cd0 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68  e used .** for h
30ce0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
30cf0 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69  ack. Once this i
30d00 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73  s done the trans
30d10 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72  action is.** irr
30d20 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74  evocably committ
30d30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
30d40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
30d50 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
30d60 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
30d70 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65  he pager.** move
30d80 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  s into the error
30d90 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
30da0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
30db0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30dc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
30dd0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
30de0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
30df0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30e10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30e20 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
30e30 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
30e40 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ot be called if 
30e50 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61  a prior error ha
30e60 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a  s occurred..  **
30e70 20 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20   But if (due to 
30e80 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65  a coding error e
30e90 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  lsewhere in the 
30ea0 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20  system) it does 
30eb0 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c  get.  ** called,
30ec0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
30ed0 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   same error code
30ee0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
30ef0 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  nything. */.  if
30f00 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
30f10 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
30f20 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
30f30 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  e;..  /* This fu
30f40 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
30f50 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  t be called if t
30f60 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
30f70 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a  in at least.  **
30f80 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
30f90 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65  state. And indee
30fa0 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64  d SQLite never d
30fb0 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74  oes this. But it
30fc0 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f   is.  ** nice to
30fd0 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e   have this defen
30fe0 73 69 76 65 20 74 65 73 74 20 68 65 72 65 20 61  sive test here a
30ff0 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyway..  */.  if
31000 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
31010 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
31020 52 56 45 44 29 20 29 20 72 65 74 75 72 6e 20 53  RVED) ) return S
31030 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
31040 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69  /* An optimizati
31050 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62  on. If the datab
31060 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75  ase was not actu
31070 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75  ally modified du
31080 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74  ring.  ** this t
31090 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
310a0 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
310b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
310c0 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75  de and is.  ** u
310d0 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20  sing persistent 
310e0 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74  journals, then t
310f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31100 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20  a no-op..  **.  
31110 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20  ** The start of 
31120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31130 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
31140 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75  ins a single jou
31150 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65  rnal .  ** heade
31160 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  r with the nRec 
31170 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20  field set to 0. 
31180 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61  If such a journa
31190 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a  l is used as.  *
311a0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
311b0 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
311c0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63  al rollback, 0 c
311d0 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d  hanges will be m
311e0 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ade.  ** to the 
311f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53  database file. S
31200 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
31210 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a  ed to zero the j
31220 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61  ournal .  ** hea
31230 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70  der. Since the p
31240 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
31250 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65  sive mode, there
31260 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a   is no need.  **
31270 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63   to drop any loc
31280 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a  ks either..  */.
31290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
312a0 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70  Modified==0 && p
312b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
312c0 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67  Mode .   && pPag
312d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
312e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
312f0 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a  DE_PERSIST.  ){.
31300 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
31320 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
31330 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65  Pager) );.    re
31340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31350 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
31360 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E(("COMMIT %d\n"
31370 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
31380 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  )));.  assert( p
31390 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
313a0 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45  GER_SYNCED || ME
313b0 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  MDB || !pPager->
313c0 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20  dbModified );.  
313d0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
313e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
313f0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
31400 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
31410 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
31420 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  er, rc);.}../*.*
31430 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
31440 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61  hanges. The data
31450 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
31460 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
31470 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  mode..**.** This
31480 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
31490 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a  ms two tasks:.**
314a0 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c  .**   1) It roll
314b0 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  s back the journ
314c0 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69  al file, restori
314d0 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  ng all database 
314e0 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20  file and .**    
314f0 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68    in-memory cach
31500 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73  e pages to the s
31510 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69  tate they were i
31520 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  n when the trans
31530 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77  action.**      w
31540 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a  as opened, and.*
31550 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69  *   2) It finali
31560 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  zes the journal 
31570 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74  file, so that it
31580 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72   is not used for
31590 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c   hot.**      rol
315a0 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69  lback at any poi
315b0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
315c0 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20  ..**.** subject 
315d0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
315e0 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a   qualifications:
315f0 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
31600 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
31610 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65  not yet open whe
31620 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
31630 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
31640 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73  then only (2) is
31650 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74   performed. In t
31660 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
31670 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s no journal fil
31680 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62  e.**   to roll b
31690 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20  ack..**.** * If 
316a0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
316b0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
316c0 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74  ITE_FULL, then t
316d0 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20  ask (1) is .**  
316e0 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73   performed. If s
316f0 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20  uccessful, task 
31700 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20  (2). Regardless 
31710 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a  of the outcome.*
31720 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74  *   of either, t
31730 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
31740 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31750 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
31760 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65  ler.**   (i.e. e
31770 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45  ither SQLITE_IOE
31780 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52  RR or SQLITE_COR
31790 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49  RUPT)..**.** * I
317a0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
317b0 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  n PAGER_RESERVED
317c0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74   state, then att
317d0 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65  empt (1). Whethe
317e0 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31  r.**   or not (1
317f0 29 20 69 73 20 73 75 63 63 75 73 73 66 75 6c 2c  ) is succussful,
31800 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32   also attempt (2
31810 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ). If successful
31820 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51  , return.**   SQ
31830 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
31840 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72  se, enter the er
31850 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
31860 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a  turn the first .
31870 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20  **   error code 
31880 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a  encountered. .**
31890 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61  .**   In this ca
318a0 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  se there is no c
318b0 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64  hance that the d
318c0 61 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74  atabase was writ
318d0 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f  ten to. .**   So
318e0 20 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61   is safe to fina
318f0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
31900 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68   file even if th
31910 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20  e playback .**  
31920 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66   (operation 1) f
31930 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74  ailed. However t
31940 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e  he pager must en
31950 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
31960 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20  ate.**   as the 
31970 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31980 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
31990 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e  are now suspect.
319a0 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79  .**.** * Finally
319b0 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58  , if in PAGER_EX
319c0 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
319d0 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
319e0 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d   Only.**   attem
319f0 70 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73  pt (2) if (1) is
31a00 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74   successful. Ret
31a10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
31a20 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
31a30 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65    otherwise ente
31a40 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
31a50 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
31a60 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
31a70 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69   the .**   faili
31a80 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  ng operation..**
31a90 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61  .**   In this ca
31aa0 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  se the database 
31ab0 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  file may have be
31ac0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53  en written to. S
31ad0 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c  o if the.**   pl
31ae0 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  ayback operation
31af0 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64   did not succeed
31b00 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65   it would not be
31b10 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a   safe to finaliz
31b20 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e  e.**   the journ
31b30 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64  al file. It need
31b40 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20  s to be left in 
31b50 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
31b60 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d  so that.**   som
31b70 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
31b80 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65  can use it to re
31b90 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
31ba0 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20  se state (by.** 
31bb0 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f    hot-journal ro
31bc0 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20  llback)..*/.int 
31bd0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
31be0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
31bf0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
31c00 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
31c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
31c20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
31c30 50 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c  PAGERTRACE(("ROL
31c40 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
31c50 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
31c60 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f    if( pagerUseLo
31c70 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  g(pPager) ){.   
31c80 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 72   int rc2;..    r
31c90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31ca0 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
31cb0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
31cc0 42 41 43 4b 2c 20 2d 31 29 3b 0a 20 20 20 20 72  BACK, -1);.    r
31cd0 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
31ce0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
31cf0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
31d00 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
31d10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
31d20 63 20 3d 20 72 63 32 3b 0a 20 20 7d 65 6c 73 65  c = rc2;.  }else
31d30 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 62   if( !pPager->db
31d40 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69 73 4f  Modified || !isO
31d50 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31d60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
31d70 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
31d80 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
31d90 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
31da0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
31db0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
31dc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
31dd0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
31de0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
31df0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
31e00 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
31e10 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
31e20 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
31e30 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
31e40 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
31e50 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
31e60 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
31e70 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20  ESERVED ){.     
31e80 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
31e90 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
31ea0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
31eb0 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65        rc2 = page
31ec0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
31ed0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
31ee0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
31ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31f10 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
31f20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
31f30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
31f40 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
31f50 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
31f60 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
31f70 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
31f80 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  eValid = 0;.    
31f90 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  }..    /* If an 
31fa0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
31fb0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
31fc0 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
31fd0 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
31fe0 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  .    ** cache. S
31ff0 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
32000 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
32010 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
32020 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65  error .    ** pe
32030 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f  rsistent..    */
32040 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
32050 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
32060 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
32070 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
32080 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
32090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
320a0 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
320b0 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
320c0 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
320d0 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
320e0 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
320f0 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  u8 sqlite3PagerI
32100 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
32110 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
32120 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
32130 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
32140 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
32150 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
32160 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
32170 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
32180 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
32190 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
321a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
321b0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
321c0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
321d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
321e0 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72 20  roximate number 
321f0 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
32200 72 79 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  ry currently.** 
32210 75 73 65 64 20 62 79 20 74 68 65 20 70 61 67 65  used by the page
32220 72 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69  r and its associ
32230 61 74 65 64 20 63 61 63 68 65 2e 0a 2a 2f 0a 69  ated cache..*/.i
32240 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
32250 65 6d 55 73 65 64 28 50 61 67 65 72 20 2a 70 50  emUsed(Pager *pP
32260 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 70 65 72  ager){.  int per
32270 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
32280 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 70 50  r->pageSize + pP
32290 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 2b 20 32  ager->nExtra + 2
322a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 65 72 50  0;.  return perP
322b0 61 67 65 53 69 7a 65 2a 73 71 6c 69 74 65 33 50  ageSize*sqlite3P
322c0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
322d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 0a  Pager->pPCache).
322e0 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 71 6c             + sql
322f0 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
32300 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
32310 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
32320 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
32330 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
32340 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  d page..*/.int s
32350 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
32360 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20 2a  efcount(DbPage *
32370 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
32380 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
32390 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  geRefcount(pPage
323a0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
323b0 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54  ITE_TEST./*.** T
323c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
323d0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
323e0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
323f0 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
32400 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67  e3PagerStats(Pag
32410 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
32420 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
32430 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65  .  a[0] = sqlite
32440 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
32450 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
32460 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74  ;.  a[1] = sqlit
32470 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
32480 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
32490 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c  e);.  a[2] = sql
324a0 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61 63  ite3PcacheGetCac
324b0 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
324c0 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20  PCache);.  a[3] 
324d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
324e0 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70 50  Valid ? (int) pP
324f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d  ager->dbSize : -
32500 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  1;.  a[4] = pPag
32510 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
32520 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
32530 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
32540 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
32550 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
32560 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20  ss;.  a[8] = 0; 
32570 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70   /* Used to be p
32580 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a  Pager->nOvfl */.
32590 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
325a0 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
325b0 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
325c0 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
325d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
325e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
325f0 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
32600 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  y pager..*/.int 
32610 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65  sqlite3PagerIsMe
32620 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  mdb(Pager *pPage
32630 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d  r){.  return MEM
32640 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  DB;.}../*.** Che
32650 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ck that there ar
32660 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65  e at least nSave
32670 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73  point savepoints
32680 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65 20   open. If there 
32690 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
326a0 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76 65   less than nSave
326b0 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65  points open, the
326c0 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  n open one or mo
326d0 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a  re savepoints.**
326e0 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65 20   to make up the 
326f0 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20 74  difference. If t
32700 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  he number of sav
32710 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65 61  epoints is alrea
32720 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e  dy.** equal to n
32730 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20  Savepoint, then 
32740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
32750 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
32760 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
32770 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51  cation fails, SQ
32780 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
32790 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
327a0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
327b0 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68 65  hile opening the
327c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
327d0 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65 72  e, then an IO er
327e0 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72  ror code is.** r
327f0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
32800 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
32810 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
32820 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
32830 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
32840 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt nSavepoint){.
32850 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32860 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
32870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
32880 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
32890 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20 70  int nCurrent = p
328a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
328b0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  t;        /* Cur
328c0 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73  rent number of s
328d0 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20  avepoints */..  
328e0 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e  if( nSavepoint>n
328f0 43 75 72 72 65 6e 74 20 26 26 20 70 50 61 67 65  Current && pPage
32900 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
32910 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
32920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32940 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
32950 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53 61  e */.    PagerSa
32960 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20  vepoint *aNew;  
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32980 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61 53   /* New Pager.aS
32990 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 2a  avepoint array *
329a0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b  /.    int nPage;
329b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
329d0 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
329e0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72  e file */..    r
329f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32a00 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
32a10 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
32a20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32a30 63 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20  c;..    /* Grow 
32a40 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
32a50 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67  oint array using
32a60 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75   realloc(). Retu
32a70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
32a80 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c      ** if the al
32a90 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20  location fails. 
32aa0 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20  Otherwise, zero 
32ab0 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20  the new portion 
32ac0 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a  in case a .    *
32ad0 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  * malloc failure
32ae0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f   occurs while po
32af0 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74  pulating it in t
32b00 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70  he for(...) loop
32b10 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
32b20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72     aNew = (Pager
32b30 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69  Savepoint *)sqli
32b40 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
32b50 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
32b60 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50  epoint, sizeof(P
32b70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e  agerSavepoint)*n
32b80 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b  Savepoint.    );
32b90 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29  .    if( !aNew )
32ba0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
32bb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
32bc0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61   }.    memset(&a
32bd0 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30  New[nCurrent], 0
32be0 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43  , (nSavepoint-nC
32bf0 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66  urrent) * sizeof
32c00 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
32c10 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
32c20 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77  Savepoint = aNew
32c30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  ;.    pPager->nS
32c40 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65  avepoint = nSave
32c50 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50  point;..    /* P
32c60 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65  opulate the Page
32c70 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63  rSavepoint struc
32c80 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63  tures just alloc
32c90 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ated. */.    for
32ca0 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69  (ii=nCurrent; ii
32cb0 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  <nSavepoint; ii+
32cc0 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69  +){.      aNew[i
32cd0 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61 67 65  i].nOrig = nPage
32ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  ;.      if( isOp
32cf0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
32d00 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
32d10 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20  alOff>0 ){.     
32d20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66     aNew[ii].iOff
32d30 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
32d40 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
32d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
32d60 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
32d70 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
32d80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
32d90 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  }.      aNew[ii]
32da0 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65  .iSubRec = pPage
32db0 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20  r->nSubRec;.    
32dc0 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61    aNew[ii].pInSa
32dd0 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65  vepoint = sqlite
32de0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 6e 50  3BitvecCreate(nP
32df0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
32e00 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76  !aNew[ii].pInSav
32e10 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
32e20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32e30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
32e40 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73       if( pagerUs
32e50 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a  eLog(pPager) ){.
32e60 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
32e70 2e 69 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65  .iFrame = sqlite
32e80 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50  3WalSavepoint(pP
32e90 61 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20  ager->pLog);.   
32ea0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
32eb0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
32ec0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
32ed0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
32ee0 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
32ef0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
32f00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
32f10 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
32f20 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  traint(pPager);.
32f30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
32f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
32f50 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
32f60 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed to rollback o
32f70 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69  r release (commi
32f80 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a  t) a savepoint..
32f90 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74  ** The savepoint
32fa0 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72   to release or r
32fb0 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74  ollback need not
32fc0 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63   be the most rec
32fd0 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65  ently .** create
32fe0 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  d savepoint..**.
32ff0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20  ** Parameter op 
33000 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
33010 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
33020 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  ACK or SAVEPOINT
33030 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20  _RELEASE..** If 
33040 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
33050 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65  RELEASE, then re
33060 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f  lease and destro
33070 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  y the savepoint 
33080 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53  with.** index iS
33090 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20  avepoint. If it 
330a0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
330b0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c  LBACK, then roll
330c0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
330d0 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63  .** that have oc
330e0 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65  curred since the
330f0 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70   specified savep
33100 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64  oint was created
33110 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65  ..**.** The save
33120 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63  point to rollbac
33130 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20  k or release is 
33140 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
33150 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76  rameter .** iSav
33160 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20  epoint. A value 
33170 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70  of 0 means to op
33180 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74  erate on the out
33190 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74  ermost savepoint
331a0 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20 63  .** (the first c
331b0 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65  reated). A value
331c0 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65   of (Pager.nSave
331d0 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f  point-1) means o
331e0 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65  perate.** on the
331f0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
33200 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74  reated savepoint
33210 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20  . If iSavepoint 
33220 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
33230 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ** (Pager.nSavep
33240 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68  oint-1), then th
33250 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
33260 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
33270 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
33280 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
33290 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
332a0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
332b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
332c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
332d0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  is is different 
332e0 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  to calling .** s
332f0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
33300 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74 68  ack() because th
33310 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
33320 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a   not terminate.*
33330 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
33340 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20  n or unlock the 
33350 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73  database, it jus
33360 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a  t restores the .
33370 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
33380 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
33390 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
333a0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79  e. .**.** In any
333b0 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70   case, all savep
333c0 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e  oints with an in
333d0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
333e0 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20   iSavepoint .** 
333f0 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49  are destroyed. I
33400 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65  f this is a rele
33410 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f  ase operation (o
33420 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
33430 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73  EASE),.** then s
33440 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f  avepoint iSavepo
33450 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74  int is also dest
33460 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  royed..**.** Thi
33470 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
33480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33490 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM if a memory a
334a0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
334b0 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  .** or an IO err
334c0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f  or code if an IO
334d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
334e0 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ile rolling back
334f0 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74   a .** savepoint
33500 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f  . If no errors o
33510 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ccur, SQLITE_OK 
33520 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20  is returned..*/ 
33530 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33540 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  rSavepoint(Pager
33550 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70   *pPager, int op
33560 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
33570 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33580 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
33590 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
335a0 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
335b0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
335c0 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ACK );.  assert(
335d0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
335e0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
335f0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69  ROLLBACK );..  i
33600 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50  f( iSavepoint<pP
33610 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
33620 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   ){.    int ii; 
33630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
33640 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
33650 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b  */.    int nNew;
33660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33670 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67  ber of remaining
33680 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65   savepoints afte
33690 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20  r this op. */.. 
336a0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
336b0 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f   how many savepo
336c0 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20  ints will still 
336d0 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20  be active after 
336e0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72  this.    ** oper
336f0 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69  ation. Store thi
33700 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e  s value in nNew.
33710 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75   Then free resou
33720 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  rces associated 
33730 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79  .    ** with any
33740 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
33750 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20 62   are destroyed b
33760 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
33770 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65  ..    */.    nNe
33780 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b  w = iSavepoint +
33790 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   (( op==SAVEPOIN
337a0 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30 20  T_RELEASE ) ? 0 
337b0 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  : 1);.    for(ii
337c0 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72  =nNew; ii<pPager
337d0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
337e0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
337f0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
33800 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
33810 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
33820 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
33830 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
33840 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20  nt = nNew;..    
33850 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
33860 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f  release of the o
33870 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
33880 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20  nt, truncate .  
33890 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
338a0 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74  rnal to zero byt
338b0 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20  es in size. */. 
338c0 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
338d0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
338e0 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d        if( nNew==
338f0 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  0 && isOpen(pPag
33900 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
33910 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75       /* Only tru
33920 6e 63 61 74 65 20 69 66 20 69 74 20 69 73 20 61  ncate if it is a
33930 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d  n in-memory sub-
33940 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
33950 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
33960 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
33970 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
33980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33990 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
339a0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
339b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
339c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
339d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
339e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75       pPager->nSu
339f0 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  bRec = 0;.      
33a00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  }.    }.    /* E
33a10 6c 73 65 20 74 68 69 73 20 69 73 20 61 20 72 6f  lse this is a ro
33a20 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
33a30 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73  , playback the s
33a40 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
33a50 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  nt..    ** If th
33a60 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  is is a temp-fil
33a70 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  e, it is possibl
33a80 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
33a90 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20  al file has.    
33aa0 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
33ab0 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
33ac0 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20  case there have 
33ad0 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
33ae0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
33af0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20  tabase file, so 
33b00 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  the playback ope
33b10 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b  ration can be sk
33b20 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
33b30 20 20 65 6c 73 65 20 69 66 28 20 70 61 67 65 72    else if( pager
33b40 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 7c  UseLog(pPager) |
33b50 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
33b60 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50  >jfd) ){.      P
33b70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
33b80 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65  Savepoint = (nNe
33b90 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d  w==0)?0:&pPager-
33ba0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77  >aSavepoint[nNew
33bb0 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  -1];.      rc = 
33bc0 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
33bd0 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70  epoint(pPager, p
33be0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
33bf0 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c    assert(rc!=SQL
33c00 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d  ITE_DONE);.    }
33c10 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .  .  }.  return
33c20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
33c30 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
33c40 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  thname of the da
33c50 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
33c60 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
33c70 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
33c80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33c90 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33ca0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
33cb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
33cc0 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66   VFS structure f
33cd0 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  or the pager..*/
33ce0 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76  .const sqlite3_v
33cf0 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  fs *sqlite3Pager
33d00 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  Vfs(Pager *pPage
33d10 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
33d20 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a  ger->pVfs;.}../*
33d30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
33d40 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  ile handle for t
33d50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33d60 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
33d70 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20  ith the pager.  
33d80 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72  This might retur
33d90 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69  n NULL if the fi
33da0 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65  le has.** not ye
33db0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a  t been opened..*
33dc0 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  /.sqlite3_file *
33dd0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
33de0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33df0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33e00 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->fd;.}../*.** R
33e10 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
33e20 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
33e30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
33e40 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
33e50 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
33e60 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
33e70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
33e80 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
33e90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33ea0 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
33eb0 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
33ec0 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
33ed0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
33ee0 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
33ef0 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
33f00 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
33f10 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
33f20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33f30 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
33f40 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64  >noSync;.}..#ifd
33f50 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
33f60 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72  DEC./*.** Set or
33f70 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f   retrieve the co
33f80 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
33f90 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  er.*/.static voi
33fa0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
33fb0 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
33fc0 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
33fd0 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
33fe0 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
33ff0 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
34000 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
34010 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  ,int,int),.  voi
34020 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
34030 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a  void*),.  void *
34040 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20  pCodec.){.  if( 
34050 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
34060 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
34070 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
34080 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65  pCodec);.  pPage
34090 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67  r->xCodec = pPag
340a0 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20  er->memDb ? 0 : 
340b0 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
340c0 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
340d0 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   = xCodecSizeChn
340e0 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  g;.  pPager->xCo
340f0 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63  decFree = xCodec
34100 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Free;.  pPager->
34110 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b  pCodec = pCodec;
34120 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  .  pagerReportSi
34130 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74  ze(pPager);.}.st
34140 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74  atic void *sqlit
34150 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63 28  e3PagerGetCodec(
34160 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
34170 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
34180 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69  >pCodec;.}.#endi
34190 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
341a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
341b0 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
341c0 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63   page pPg to loc
341d0 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
341e0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
341f0 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
34200 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
34210 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
34220 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70   located at.** p
34230 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61  gno (which we ca
34240 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67  ll pPgOld) thoug
34250 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61  h that page is a
34260 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20  llowed to be.** 
34270 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68  in cache.  If th
34280 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
34290 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e  y located at pgn
342a0 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
342b0 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  .** in the rollb
342c0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
342d0 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65  is not put there
342e0 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74   by by this rout
342f0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
34300 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
34310 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c  e pPg remain val
34320 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
34330 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
34340 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
34350 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  g (i.e. data sto
34360 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
34370 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
34380 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
34390 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
343a0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
343b0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
343c0 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
343d0 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
343e0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
343f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
34400 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
34410 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
34420 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
34430 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
34440 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
34450 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
34460 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
34470 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
34480 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
34490 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
344a0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
344b0 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a  n is active)..**
344c0 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74  .** If the fourt
344d0 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f  h argument, isCo
344e0 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72  mmit, is non-zer
344f0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
34500 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f  e is being.** mo
34510 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ved as part of a
34520 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61   database reorga
34530 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65  nization just be
34540 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
34550 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e  tion .** is bein
34560 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20  g committed. In 
34570 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73  this case, it is
34580 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
34590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
345a0 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72  ge .** pPg refer
345b0 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s to will not be
345c0 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69   written to agai
345d0 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
345e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
345f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
34600 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
34610 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
34620 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
34630 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
34640 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
34650 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
34660 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
34670 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
34680 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
34690 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
346a0 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d  pgno, int isComm
346b0 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  it){.  PgHdr *pP
346c0 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  gOld;           
346d0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
346e0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
346f0 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65  n. */.  Pgno nee
34700 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20  dSyncPgno = 0;  
34710 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75       /* Old valu
34720 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  e of pPg->pgno, 
34730 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  if sync is requi
34740 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  red */.  int rc;
34750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34760 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
34770 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  code */.  Pgno o
34780 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20  rigPgno;        
34790 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
347a0 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  iginal page numb
347b0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
347c0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
347d0 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74  .  /* In order t
347e0 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  o be able to rol
347f0 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d  lback, an in-mem
34800 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d 75 73  ory database mus
34810 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74  t journal.  ** t
34820 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 6d  he page we are m
34830 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f  oving from..  */
34840 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
34850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34860 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
34870 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
34880 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
34890 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
348a0 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
348b0 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
348c0 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
348d0 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
348e0 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
348f0 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
34900 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
34910 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
34920 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
34930 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
34940 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
34950 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
34960 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
34970 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
34980 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
34990 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
349a0 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
349b0 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
349c0 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
349d0 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
349e0 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
349f0 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
34a00 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
34a10 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
34a20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
34a30 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
34a40 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
34a50 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
34a60 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
34a70 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
34a80 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
34a90 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
34aa0 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f  ment were is pro
34ab0 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  cessed..  **.  *
34ac0 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  * subjournalPage
34ad0 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61  () may need to a
34ae0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
34af0 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
34b00 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f   into.  ** one o
34b10 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
34b20 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69   bitvecs. This i
34b30 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69  s the reason thi
34b40 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
34b50 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
34b60 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20  E_NOMEM..  */.  
34b70 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
34b80 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20 26 26  GHDR_DIRTY.   &&
34b90 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
34ba0 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c  e(pPg).   && SQL
34bb0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75  ITE_OK!=(rc = su
34bc0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
34bd0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
34be0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
34bf0 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20  GERTRACE(("MOVE 
34c00 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
34c10 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
34c20 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
34c30 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
34c40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67   pPg->pgno, (pPg
34c50 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
34c60 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67  ED_SYNC)?1:0, pg
34c70 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  no));.  IOTRACE(
34c80 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
34c90 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
34ca0 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
34cb0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
34cc0 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
34cd0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70  ync()ed before p
34ce0 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61  age pPg->pgno ca
34cf0 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  n.  ** be writte
34d00 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d  n to, store pPg-
34d10 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76  >pgno in local v
34d20 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63  ariable needSync
34d30 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Pgno..  **.  ** 
34d40 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20  If the isCommit 
34d50 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
34d60 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
34d70 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20   remember that. 
34d80 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
34d90 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
34da0 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
34db0 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70  base page pPg->p
34dc0 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65  gno .  ** can be
34dd0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
34de0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
34df0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
34e00 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e   to write to it.
34e10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67  .  */.  if( (pPg
34e20 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
34e30 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43  ED_SYNC) && !isC
34e40 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65  ommit ){.    nee
34e50 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
34e60 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
34e70 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
34e80 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
34e90 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
34ea0 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  gSize );.    ass
34eb0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
34ec0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
34ed0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34ee0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
34ef0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
34f00 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
34f10 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
34f20 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
34f30 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
34f40 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
34f50 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
34f60 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
34f70 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
34f80 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
34f90 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
34fa0 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
34fb0 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
34fc0 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
34fd0 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
34fe0 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
34ff0 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53  &= ~PGHDR_NEED_S
35000 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20  YNC;.  pPgOld = 
35010 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
35020 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
35030 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c  sert( !pPgOld ||
35040 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31   pPgOld->nRef==1
35050 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64   );.  if( pPgOld
35060 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61   ){.    pPg->fla
35070 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66  gs |= (pPgOld->f
35080 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
35090 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28 20 4d  SYNC);.    if( M
350a0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EMDB ){.      /*
350b0 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72 64 20   Do not discard 
350c0 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e  pages from an in
350d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
350e0 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68 74 0a   since we might.
350f0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
35100 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e   rollback later.
35110 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68 65 20    Just move the 
35120 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68 65 20  page out of the 
35130 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  way. */.      as
35140 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
35150 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
35160 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
35170 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70 50 61  Move(pPgOld, pPa
35180 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a  ger->dbSize+1);.
35190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
351a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
351b0 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  op(pPgOld);.    
351c0 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e  }.  }..  origPgn
351d0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
351e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
351f0 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  ve(pPg, pgno);. 
35200 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
35210 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
35220 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
35230 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  ed = 1;..  if( n
35240 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
35250 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
35260 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
35270 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
35280 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
35290 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
352a0 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
352b0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
352c0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
352d0 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
352e0 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
352f0 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
35300 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
35310 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
35320 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73   the .    ** "is
35330 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76   journaled" bitv
35340 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e  ec flag has been
35350 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
35360 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
35370 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e  by.    ** loadin
35380 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  g the page into 
35390 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
353a0 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
353b0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a  PgHdr.needSync .
353c0 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20      ** flag..   
353d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
353e0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  e attempt to loa
353f0 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  d the page into 
35400 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66  the page-cache f
35410 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a  ails, (due.    *
35420 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20  * to a malloc() 
35430 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20  or IO failure), 
35440 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e  clear the bit in
35450 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b   the pInJournal[
35460 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20  ].    ** array. 
35470 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
35480 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  e page is loaded
35490 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61   and written aga
354a0 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69  in in.    ** thi
354b0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
354c0 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
354d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
354e0 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20   file before.   
354f0 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64   ** it is synced
35500 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
35510 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79  l file. This way
35520 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20  , it may end up 
35530 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
35540 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65  urnal file twice
35550 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f  , but that is no
35560 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20  t a problem..   
35570 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
35580 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
35590 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
355a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
355b0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
355c0 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
355d0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
355e0 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
355f0 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70   */.    PgHdr *p
35600 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
35610 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
35620 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
35630 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
35640 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
35650 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
35660 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
35680 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  f( needSyncPgno<
35690 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
356a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ize ){.        a
356b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
356c0 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20  TmpSpace!=0 );. 
356d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
356e0 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
356f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
35700 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67  edSyncPgno, pPag
35710 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
35720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
35730 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
35740 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
35750 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  ync = 1;.    ass
35760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ert( pPager->noS
35770 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  ync==0 && !MEMDB
35780 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   );.    pPgHdr->
35790 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
357a0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71  EED_SYNC;.    sq
357b0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
357c0 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
357d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
357e0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
357f0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  /*.  ** For 
35800 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
35810 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  abase, make sure
35820 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
35830 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a  ge continues.  *
35840 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63  * to exist, in c
35850 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
35860 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c  ion needs to rol
35870 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70 50 67  l back.  Use pPg
35880 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68 65 20  Old.  ** as the 
35890 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 73 69  original page si
358a0 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72 65 61  nce it has alrea
358b0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
358c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  d..  */.  if( ME
358d0 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MDB ){.    sqlit
358e0 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
358f0 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a  Old, origPgno);.
35900 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
35910 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20  Unref(pPgOld);. 
35920 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
35930 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
35940 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
35950 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
35960 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
35970 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
35980 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
35990 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
359a0 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
359b0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
359c0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
359d0 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
359e0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
359f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
35a00 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
35a10 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
35a20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
35a30 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
35a40 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
35a50 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
35a60 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
35a70 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
35a80 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
35a90 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a  rn pPg->pExtra;.
35aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
35ab0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
35ac0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
35ad0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
35ae0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
35af0 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
35b00 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
35b10 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
35b20 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
35b30 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
35b40 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
35b50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
35b60 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
35b70 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
35b80 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
35b90 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
35ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
35bb0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
35bc0 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
35bd0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
35be0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
35bf0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
35c00 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
35c10 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
35c20 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
35c30 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
35c40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
35c50 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
35c60 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
35c70 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
35c80 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
35c90 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
35ca0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
35cb0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
35cc0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
35cd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
35ce0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
35cf0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
35d00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
35d10 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
35d20 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
35d30 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
35d40 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
35d50 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
35d60 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
35d70 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
35d80 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
35d90 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
35da0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
35db0 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  eMode = (u8)eMod
35dc0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
35dd0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
35de0 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f  lusiveMode;.}../
35df0 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
35e00 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
35e10 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
35e20 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
35e30 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  st be one of:.**
35e40 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
35e50 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a  RNALMODE_QUERY.*
35e60 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
35e70 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a  ALMODE_DELETE.**
35e80 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
35e90 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a  LMODE_TRUNCATE.*
35ea0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
35eb0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a  ALMODE_PERSIST.*
35ec0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
35ed0 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20  ALMODE_OFF.**   
35ee0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
35ef0 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  DE_MEMORY.**    
35f00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35f10 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_WAL.**.** If t
35f20 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
35f30 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
35f40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
35f50 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
35f60 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  ** value specifi
35f70 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65  ed if the change
35f80 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 54 68 65   is allowed. The
35f90 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 64   change may be d
35fa0 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72  isallowed.** for
35fb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
35fc0 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  easons:.**.**   
35fd0 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  *  An in-memory 
35fe0 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c  database can onl
35ff0 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e  y have its journ
36000 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f  al_mode set to _
36010 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f  OFF.**      or _
36020 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20  MEMORY..**.**   
36030 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  *  The journal m
36040 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  ode may not be c
36050 68 61 6e 67 65 64 20 77 68 69 6c 65 20 61 20 74  hanged while a t
36060 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
36070 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tive..**.** The 
36080 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74  returned indicat
36090 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  e the current (p
360a0 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
360b0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a   journal-mode..*
360c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
360d0 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  erJournalMode(Pa
360e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
360f0 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
36100 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
36110 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
36120 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
36130 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
36140 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
36150 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36160 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
36170 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
36180 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
36190 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
361a0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
361b0 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  T.            ||
361c0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
361d0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
361e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
361f0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
36200 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
36210 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
36220 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36230 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
36240 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f  assert( PAGER_JO
36250 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c  URNALMODE_QUERY<
36260 30 20 29 3b 0a 0a 20 20 69 66 28 20 65 4d 6f 64  0 );..  if( eMod
36270 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
36280 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 26 26 20  MODE_WAL .   && 
36290 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
362a0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
362b0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
362c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
362d0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
362e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
362f0 41 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  AL;.  }else if( 
36300 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20 28  eMode>=0.   && (
36310 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
36320 3d 3d 30 20 7c 7c 20 65 4d 6f 64 65 21 3d 50 41  ==0 || eMode!=PA
36330 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36340 57 41 4c 29 0a 20 20 20 26 26 20 28 21 4d 45 4d  WAL).   && (!MEM
36350 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47  DB || eMode==PAG
36360 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
36370 45 4d 4f 52 59 7c 7c 65 4d 6f 64 65 3d 3d 50 41  EMORY||eMode==PA
36380 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36390 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67  OFF).   && !pPag
363a0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20  er->dbModified. 
363b0 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50    && (!isOpen(pP
363c0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d  ager->jfd) || 0=
363d0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
363e0 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  Off).  ){.    if
363f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
36400 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73  >jfd) ){.      s
36410 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
36420 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
36430 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  }.    assert( (P
36440 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36450 5f 54 52 55 4e 43 41 54 45 20 26 20 31 29 3d 3d  _TRUNCATE & 1)==
36460 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
36470 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
36480 4f 44 45 5f 50 45 52 53 49 53 54 20 26 20 31 29  ODE_PERSIST & 1)
36490 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
364a0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
364b0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 31  LMODE_DELETE & 1
364c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
364d0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
364e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20  ALMODE_MEMORY & 
364f0 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  1)==0 );.    ass
36500 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
36510 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 31 29  NALMODE_OFF & 1)
36520 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
36530 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
36540 6f 64 65 20 26 20 31 29 3d 3d 31 20 26 26 20 28  ode & 1)==1 && (
36550 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30 0a 20 20  eMode & 1)==0.  
36560 20 20 20 20 20 20 20 26 26 20 21 70 50 61 67 65         && !pPage
36570 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
36580 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
36590 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
365a0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
365b0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
365c0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
365d0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28  >journalMode = (
365e0 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
365f0 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
36600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b  er->journalMode;
36610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
36620 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74  t the size-limit
36630 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73   used for persis
36640 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
36650 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e  es..**.** Settin
36660 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74  g the size limit
36670 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20   to -1 means no 
36680 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65  limit is enforce
36690 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74  d..** An attempt
366a0 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20   to set a limit 
366b0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20  smaller than -1 
366c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
366d0 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  64 sqlite3PagerJ
366e0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28  ournalSizeLimit(
366f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
36700 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66  64 iLimit){.  if
36710 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a  ( iLimit>=-1 ){.
36720 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36730 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69  nalSizeLimit = i
36740 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
36750 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  urn pPager->jour
36760 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a  nalSizeLimit;.}.
36770 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
36780 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
36790 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76  Pager->pBackup v
367a0 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63  ariable. The bac
367b0 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e  kup module.** in
367c0 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61   backup.c mainta
367d0 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ins the content 
367e0 6f 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  of this variable
367f0 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a  . This module.**
36800 20 75 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c   uses it opaquel
36810 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  y as an argument
36820 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75   to sqlite3Backu
36830 70 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a  pRestart() and.*
36840 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55  * sqlite3BackupU
36850 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f  pdate() only..*/
36860 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20  .sqlite3_backup 
36870 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42 61  **sqlite3PagerBa
36880 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a 70  ckupPtr(Pager *p
36890 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
368a0 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75   &pPager->pBacku
368b0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
368c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
368d0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  led when the use
368e0 72 20 69 6e 76 6f 6b 65 73 20 22 50 52 41 47 4d  r invokes "PRAGM
368f0 41 20 63 68 65 63 6b 70 6f 69 6e 74 22 2e 0a 2a  A checkpoint"..*
36900 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36910 65 72 43 68 65 63 6b 70 6f 69 6e 74 28 50 61 67  erCheckpoint(Pag
36920 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
36930 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36940 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
36950 3e 70 4c 6f 67 20 29 7b 0a 20 20 20 20 75 38 20  >pLog ){.    u8 
36960 2a 7a 42 75 66 20 3d 20 28 75 38 20 2a 29 70 50  *zBuf = (u8 *)pP
36970 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
36980 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36990 33 57 61 6c 43 68 65 63 6b 70 6f 69 6e 74 28 70  3WalCheckpoint(p
369a0 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61  Pager->pLog, pPa
369b0 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
369c0 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e    (pPager->noSyn
369d0 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e  c ? 0 : pPager->
369e0 73 79 6e 63 5f 66 6c 61 67 73 29 2c 0a 20 20 20  sync_flags),.   
369f0 20 20 20 20 20 7a 42 75 66 2c 20 70 50 61 67 65       zBuf, pPage
36a00 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 2c  r->xBusyHandler,
36a10 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
36a20 6e 64 6c 65 72 41 72 67 0a 20 20 20 20 29 3b 0a  ndlerArg.    );.
36a30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36a40 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .}..int sqlite3P
36a50 61 67 65 72 4c 6f 67 43 61 6c 6c 62 61 63 6b 28  agerLogCallback(
36a60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
36a70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
36a80 57 61 6c 43 61 6c 6c 62 61 63 6b 28 70 50 61 67  WalCallback(pPag
36a90 65 72 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a  er->pLog);.}../*
36aa0 0a 2a 2a 20 4f 70 65 6e 20 61 20 63 6f 6e 6e 65  .** Open a conne
36ab0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 72 69  ction to the wri
36ac0 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 66 69 6c  te-ahead log fil
36ad0 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
36ae0 65 72 2e 20 49 66 0a 2a 2a 20 74 68 65 20 6c 6f  er. If.** the lo
36af0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  g connection is 
36b00 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
36b10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
36b20 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
36b30 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 62 65  e caller must be
36b40 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45   holding a SHARE
36b50 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
36b60 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
36b70 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  all.** this func
36b80 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
36b90 69 74 65 33 50 61 67 65 72 4f 70 65 6e 4c 6f 67  ite3PagerOpenLog
36ba0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
36bb0 69 6e 74 20 2a 70 69 73 4f 70 65 6e 29 7b 0a 20  int *pisOpen){. 
36bc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36bd0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
36be0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
36bf0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
36c00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
36c10 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
36c20 66 28 20 21 70 50 61 67 65 72 2d 3e 70 4c 6f 67  f( !pPager->pLog
36c30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
36c40 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
36c50 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  to the log file.
36c60 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
36c70 6f 6e 20 66 61 69 6c 73 2c 20 0a 20 20 20 20 2a  on fails, .    *
36c80 2a 20 28 65 2e 67 2e 20 64 75 65 20 74 6f 20 6d  * (e.g. due to m
36c90 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 29  alloc() failure)
36ca0 2c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  , unlock the dat
36cb0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a  abase file and .
36cc0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e      ** return an
36cd0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
36ce0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
36cf0 69 74 65 33 57 61 6c 4f 70 65 6e 28 70 50 61 67  ite3WalOpen(pPag
36d00 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
36d10 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 70 50  ->zFilename, &pP
36d20 61 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20  ager->pLog);.   
36d30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36d40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
36d50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
36d60 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
36d70 4f 44 45 5f 57 41 4c 3b 0a 20 20 20 20 7d 0a 20  ODE_WAL;.    }. 
36d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 73   }else{.    *pis
36d90 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Open = 1;.  }.. 
36da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
36db0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
36dc0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
36dd0 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   close the conne
36de0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 67  ction to the log
36df0 20 66 69 6c 65 20 70 72 69 6f 72 0a 2a 2a 20 74   file prior.** t
36e00 6f 20 73 77 69 74 63 68 69 6e 67 20 66 72 6f 6d  o switching from
36e10 20 57 41 4c 20 74 6f 20 72 6f 6c 6c 62 61 63 6b   WAL to rollback
36e20 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66   mode..**.** Bef
36e30 6f 72 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  ore closing the 
36e40 6c 6f 67 20 66 69 6c 65 2c 20 74 68 69 73 20 66  log file, this f
36e50 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
36e60 20 74 6f 20 74 61 6b 65 20 61 6e 20 0a 2a 2a 20   to take an .** 
36e70 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
36e80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36e90 69 6c 65 2e 20 49 66 20 74 68 69 73 20 63 61 6e  ile. If this can
36ea0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
36eb0 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 28 53 51   an.** error (SQ
36ec0 4c 49 54 45 5f 42 55 53 59 29 20 69 73 20 72 65  LITE_BUSY) is re
36ed0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6c  turned and the l
36ee0 6f 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  og connection is
36ef0 20 6e 6f 74 20 63 6c 6f 73 65 64 2e 0a 2a 2a 20   not closed..** 
36f00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
36f10 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
36f20 6b 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65  k is not release
36f30 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
36f40 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
36f50 65 33 50 61 67 65 72 43 6c 6f 73 65 4c 6f 67 28  e3PagerCloseLog(
36f60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
36f70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36f80 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
36f90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36fa0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
36fb0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 0a  NALMODE_WAL );..
36fc0 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 67 20    /* If the log 
36fd0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  file is not alre
36fe0 61 64 79 20 6f 70 65 6e 2c 20 62 75 74 20 64 6f  ady open, but do
36ff0 65 73 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  es exist in the 
37000 66 69 6c 65 2d 73 79 73 74 65 6d 2c 0a 20 20 2a  file-system,.  *
37010 2a 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  * it may need to
37020 20 62 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 64   be checkpointed
37030 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e   before the conn
37040 65 63 74 69 6f 6e 20 63 61 6e 20 73 77 69 74 63  ection can switc
37050 68 20 74 6f 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  h to.  ** rollba
37060 63 6b 20 6d 6f 64 65 2e 20 4f 70 65 6e 20 69 74  ck mode. Open it
37070 20 6e 6f 77 20 73 6f 20 74 68 69 73 20 63 61 6e   now so this can
37080 20 68 61 70 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20   happen..  */.  
37090 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 4c 6f  if( !pPager->pLo
370a0 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 67  g ){.    int log
370b0 65 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20  exists = 0;.    
370c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
370d0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
370e0 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
370f0 44 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  D);.    if( rc==
37100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37110 20 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73     rc = pagerHas
37120 57 41 4c 28 70 50 61 67 65 72 2c 20 26 6c 6f 67  WAL(pPager, &log
37130 65 78 69 73 74 73 29 3b 0a 20 20 20 20 7d 0a 20  exists);.    }. 
37140 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37150 45 5f 4f 4b 20 26 26 20 6c 6f 67 65 78 69 73 74  E_OK && logexist
37160 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
37170 73 71 6c 69 74 65 33 57 61 6c 4f 70 65 6e 28 70  sqlite3WalOpen(p
37180 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
37190 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
371a0 26 70 50 61 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a  &pPager->pLog);.
371b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20      }.  }.    . 
371c0 20 2f 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 61   /* Checkpoint a
371d0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67  nd close the log
371e0 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
371f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68  LUSIVE lock is h
37200 65 6c 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  eld on.  ** the 
37210 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
37220 68 65 20 6c 6f 67 20 61 6e 64 20 6c 6f 67 2d 73  he log and log-s
37230 75 6d 6d 61 72 79 20 66 69 6c 65 73 20 77 69 6c  ummary files wil
37240 6c 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 20  l be deleted..  
37250 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
37260 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
37270 2d 3e 70 4c 6f 67 20 29 7b 0a 20 20 20 20 72 63  ->pLog ){.    rc
37280 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
37290 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
372a0 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
372b0 56 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  VE);.    if( rc=
372c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
372d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
372e0 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
372f0 3e 70 4c 6f 67 2c 20 70 50 61 67 65 72 2d 3e 66  >pLog, pPager->f
37300 64 2c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  d,.        (pPag
37310 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a  er->noSync ? 0 :
37320 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
37330 61 67 73 29 2c 20 0a 20 20 20 20 20 20 20 20 28  ags), .        (
37340 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
37350 53 70 61 63 65 0a 20 20 20 20 20 20 29 3b 0a 20  Space.      );. 
37360 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 6f       pPager->pLo
37370 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
37380 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37390 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
373a0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
373b0 0a                                               .